codeTop100题(7)53. 最大子数组和

65 阅读1分钟

1. 题目

53. 最大子数组和

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. 总结

这题已经不知道刷了多少次了,之前都是记答案,过一段时间就不会了;最近开始掌握动态规划的技巧后,有了自己的一些心得,不记得答案,也能分析出答案,感觉挺不错的。