1. 题目
2. 分析
注意:子数组是要求连续的 求最大,感觉可以用动态规划来做
- 定义dp数组含义:i位置的最长子数组的长度
- 递推公式 dp[i] = max(nums[i], dp[i-1]+nums[i])
- 边界条件 dp[0] = nums[i]
- 确定顺序:从0开始
- 举例:第一个节点的最长要么是和前面的组成子数组,否则就自己组成子数组
3. 代码
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
max = Math.max(max, dp[i]);
}
return max;
}
}
4. 优化
上面的代码我们发现,dp数组永远只用到了dp[i-1],前面的数据都没使用,那么我们就可以把这个数组的空间给节省了:
public int maxSubArray(int[] nums) {
int pre = nums[0];
int max = pre;
for (int i = 1; i < nums.length; i++) {
pre = Math.max(pre + nums[i], nums[i]);
max = Math.max(max, pre);
}
return max;
}
5. 总结
这题已经不知道刷了多少次了,之前都是记答案,过一段时间就不会了;最近开始掌握动态规划的技巧后,有了自己的一些心得,不记得答案,也能分析出答案,感觉挺不错的。