Easy
没搞懂变量 不变量,这里preSum其实是定量,minPreSum是变量,所以我们要求变量的最小值,而不是去求不变量的最大值。
public int maxSubArray(int[] nums) {
int maxSubSum = Integer.MIN_VALUE;
int preSum = 0;
int minPreSum = 0;
//sum[i,j] = sum[0,j] - sum[0, i];
for (int i = 0; i < nums.length; i++){
preSum += nums[i];
maxSubSum = Math.max(maxSubSum, preSum - minPreSum);
minPreSum = Math.min(minPreSum, preSum);
}
return maxSubSum;
}
}
另一种更加好理解的方法:本质上是dp.保持一个sum变量记录当前preSum, 在遍历时,如果当前sum < 0,就不要继续加nums[i]了,这样对于从nums[i]这里出发的subarray来说肯定不如只有nums[i]所构成的subarray sum大,这时候就更新为sum = nums[i].
public class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1){
return nums[0];
}
int sum = nums[0];
int max = nums[0];
for (int i = 1; i < nums.length; i++){
if (sum < 0){
sum = nums[i];
} else {
sum += nums[i];
}
max = Math.max(sum, max);
}
return max;
}
}