题解:
贪心算法,每次轮询分为三步:
- 如果之前的子序列和小于1,就需要扔掉,因为如果序列全都是正数的话一直加到结尾就是最大值了,有负数就要扔掉(或最小化)负数对于最大子序列和的影响。(红色箭头)
- 计算本次子序列和subSum=subSum+cur (绿色箭头)
- 查看最大子序列和是否需要更新为目前序列和(蓝色箭头)
对于序列 {-2,1,-3,4,-1,2,1,-5,4} 的轮询示例:
当前轮询 cur | 之前和 subSum | 目前和 subSum | 最大子序列和 maxSum |
-2 | 0 | -2 | Integer.MIN_VALUE |
1 | -2(<0变0) | 1 | 1 |
-3 | 1 | -2 | 1 |
4 | -2(<0变0) | 4 | 4 |
-1 | 4 | 3 | 4 |
2 | 3 | 5 | 5 |
1 | 5 | 6 | 6 |
-5 | 6 | 1 | 6 |
4 | 1 | 5 | 6 |
class Solution {
public int maxSubArray(int[] nums) {
int subSum=0;
int maxSum=Integer.MIN_VALUE;
for (int i=0;i<nums.length;i++) {
int cur = nums[i];
System.out.println("cur:"+cur+" subSum:"+subSum+" maxSum:"+maxSum);
subSum = subSum<0 ? 0 :subSum;
System.out.println("subSum或许有变:"+subSum);
subSum=subSum+cur;
if(subSum>maxSum) {
maxSum=subSum;
System.out.println("maxSum改变:"+maxSum);
}
}
return maxSum;
}
}