leetcode 力扣 53 最大子数组和

74 阅读1分钟

lc53.jpeg

lc53_2.jpeg

动态规划思路:

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;
    }