思路:
(1) dp[i]:以第i项结束的最大和,答案是dp[i]中的最大值,所以要求两次最值!!!
(2) dp[i] = max(dp[i-1] + nums[i], nums[i]);
dp[i-1] < 0时,dp[i] = nums[i];
dp[i-1] > 0时,dp[i] = dp[i-1] + nums[i];
所以如上
(3) dp[0] = nums[0];
代码:
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
int i = 0, max = nums[0];
if(nums.length == 1)
return nums[0];
dp[0] = nums[0];
for(i=1; i<nums.length; i++){
dp[i] = Math.max(dp[i-1]+nums[i], nums[i]); // dp[i] = Math.max(dp[i-1], 0) + nums[i];
max = Math.max(dp[i], max);
}
return max;
}
官方代码:
不创建新数组,直接用原数组
public int maxSubArray(int[] nums) {
int res = nums[0];
for(int i = 1; i < nums.length; i++) {
nums[i] += Math.max(nums[i - 1], 0);
res = Math.max(res, nums[i]);
}
return res;
}