本题较为简单, 提供两个思路
思路一 : 系统化的思路, 最初的结果肯定是第一个元素 A[0], 假设我们解决了 A[1, .. , i - 1] 的问题, 如何扩展到 A[1, .. , i] 呢 ?
就是当前最大值与 A[i] 的和、A[i] 两者间的较大值.
class Solution {
public int maxSubArray(int[] nums) {
int MaxSoFar = nums[0], MaxEndingHere = nums[0];
for(int i = 1; i < nums.length; ++i) {
MaxEndingHere = Math.max(MaxEndingHere + nums[i], nums[i]);
MaxSoFar = Math.max(MaxSoFar, MaxEndingHere);
}
return MaxSoFar;
}
}
思路二 : 记录一下当前的累加和, 一旦出现小于 0, 那么不管下一个数为正或者负, 都比加上这个负数的累加和要大. 所以将累加和清零.
class Solution {
public int maxSubArray(int[] nums) {
int result = Integer.MIN_VALUE;
int sum = 0;
for(int i = 0; i < nums.length; ++i) {
sum += nums[i];
if(sum > result)
result = sum;
if(sum < 0)
sum = 0;
}
return result;
}
}