// 贪心法
class Solution {
public int maxSubArray(int[] nums) {
int sum = 0;
int max = Integer.MIN_VALUE;
for(int i: nums){
sum+=i;
max = Math.max(sum,max);
if(sum<0){
sum=0;
}
}
return max;
}
}
// 前缀和法
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0;
int min_sum = 0;
int max= Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
pre+=nums[i];
max= Math.max(max,pre-min_sum);
min_sum = Math.min(min_sum,pre);
}
return max;
}
}
题解:
贪心法:从头累加数组,如果累加和小于0,直接舍去(因为对后面的累加和来说会带来不好的影响),sum重新置为0。
前缀和法:求子数组和,可以用一个前缀和减去另一个前缀和的形式求得,所以题目可以理解为一个前缀和减去另一个前缀和的最大值,类似于股票买卖问题(什么时候买什么时候卖收益最大)。