对一个有n个元素的数组,求最大的连续子数组的和,并求其开始、结束下标。
数组的元素必然有正数也有负数才有意义,如果全是正数,那最大的子数组就是本身;如果全部为负数,那最大子数组就是空数组。
例如下面的数组,其最大子数组序列和为187,子数组为X[2,..,6]:
31 | -41 | 59 | 26 | -53 | 58 | 97 | -93 | -23 | 84 |
---|
先给定一个temp,让它从头开始加每个数字,temp小于0时,我们重新开始计算,另temp = 0,让开始的下标从这个位置开始。再记一个max,是我们用来存结果的,如果temp大于max,则让max = temp,让end下标移到这个位置.
public void maxSum(int[] nums) {
int start = 0;
int end = 0;
int max = 0;
int temp = 0;
int ts = 0;
for(int i = 0; i < nums.length; i++) {
temp += nums[i];
if(temp < 0) {
ts = i + 1;
temp = 0;
} else {
if(temp > max) {
start = ts;
end = i;
max = temp;
}
}
}
System.out.println("maxSum = " + max + ", start : " + start + ", end = " + end);
}
时间复杂度O(N)