publicclass Q31 {
/**
* 题目:连续子数组的最大和
* 题目说明:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)。
* 举例说明:输入数组{1,-2,3,10,-4,7,2,-5}和的子数组最大的为{3,10,-4,7,2},因此输出18
* 解题思路:如果利用蛮力去解决该问题则需要枚举出所有子数组的和,若有n个元素,则需要n*(n-1)/2个子数组。这样时间的复杂度至少为O(n^2)级别。显然不符合要求。
* 我采用的是累加和的形式。当前k个元素的和为负数时,则抛弃前k个元素,从第k+1个元素开始重新求和。、
* 当下一个元素为负数时,先保存前边元素的和(result)(result有可能是最大的子数组和),继续求和如果和大于result,则将新的和替换result的值。
*/
publicstatic void main(String[] args) {
Q31 test = new Q31();
int[] array = {1,-2,3,10,-4,7,2,-5};
System.out.println(test.getGreatestSumOfSubArray(array));
}
booleaninputInvalid = false;//用于监视输入的数组是否合法
publicint getGreatestSumOfSubArray(int[] array){
if(array ==null || array.length <=0){
inputInvalid = true;
return 0;
}
inputInvalid =false;
int partSum = 0;//临时存放和值
int maxSubSum = -65536;//此处需要注意,最大值有可能还小于-65536
for(int i = 0; i < array.length; i++){
if(partSum <= 0){//如果前几个元素的和为非正数,则将下一个元素做为第一个求和元素
partSum = array[i];
}else {
//partSum = partSum + array[i];
partSum+=array[i];
}
if(partSum > maxSubSum){
maxSubSum = partSum;
}
}
return maxSubSum;
}
}
Q31:连续子数组的最大和
最新推荐文章于 2016-08-29 09:08:27 发布