题目
53. 最大子序和
题解
其实这个描述不够准确,应该是最大子数组和才对
1 动态规划
这个需要懂得一个技巧,如何确定这个是不是一个新的子数组的开头,就是看前一个位置的值是否是正值,如果是正值,那么对于当前的值就是有增加效果的。
如果前面一个值是负的,那么当前值就是最大值就是nums[i]
如果前面一个值是正的,那么当前的最大值就是last + nums[i]
public int maxSubArray(int[] nums) {
if (nums == null || nums.length ==0) {
return 0;
}
int len = nums.length;
int[] dp = new int[len];
int max = nums[0];
dp[0] = nums[0];
for (int i = 1; i < len; i++) {
if (dp[i - 1] > 0) {
dp[i] = dp[i - 1] + nums[i];
} else {
dp[i] = nums[i];
}
max = Math.max(dp[i], max);
}
return max;
}
空间复杂度优化后的解法:
public int maxSubArray(int[] nums) {
if (nums == null || nums.length ==0) {
return 0;
}
int len = nums.length;
int lastMax = nums[0];
int max = nums[0];
for (int i = 1; i < len; i++) {
if (lastMax > 0) {
lastMax = lastMax + nums[i];
} else {
lastMax = nums[i];
}
max = Math.max(lastMax, max);
}
return max;
}
还有时间复杂度更小的方式就是分治思想。