动态规划思路:
dp[i - 1]加上nums[i]后,得到的结果比nums[i]大还是小?如果大了保存为新的dp,如果比nums[i]还要小,就没有必要加上dp[i - 1]了,直接将nums[i]设为新的dp。
而不是说,dp[i - 1]加上nums[i]后,得到的结果跟dp[i - 1]相比变小了,然后把dp[i - 1]保存到dp[i],这样是不行的,因为子数组是左到右累加,dp[i]要么是dp[i - 1] + nums[i],要么是nums[i]。不能跳过nums[i]。如果要计算和最大的子数组长度,则可以根据dp[i - 1] + nums[i] > dp[i - 1]来累加长度。
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
int ans = nums[0];
for (int i = 1; i < n; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
ans = Math.max(ans, dp[i]);
}
return ans;
}
还可以进行空间优化,因为dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);只用到dp中的一个数,所以可以用一个整数代替dp[i - 1]。
public int maxSubArray(int[] nums) {
int pre = nums[0];
int ans = nums[0];
for (int i = 1; i < nums.length; i++) {
pre = Math.max(pre + nums[i], nums[i]);
ans = Math.max(ans, pre);
}
return ans;
}