leetcode 53. 最大子序和 [java/动态规划]

106 阅读1分钟

题目 难度:简单

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

代码

优化前:dp思路,我永远只需要知道当前值,和当前值+前面的的最大和谁是最大的即可。

class Solution {
    public int maxSubArray(int[] nums) {
        int maxSum = nums[0];//当前最大值
        int len = nums.length;
        int[] dp = new int[len];
        dp[0] = nums[0];
        for(int i=1;i<len ;i++){
            dp[i] = Math.max(nums[i]+dp[i-1],nums[i]);
            maxSum = Math.max(dp[i],maxSum);
        }
        return maxSum;
    }
}
优化后:优化思路,我定义的dp数组,经过观察发现只用到了i的前一个值即i-1那么使用preMax替代i-i
 public int maxSubArray(int[] nums) {
       int maxSum = nums[0];//当前最大值
        int preMax = nums[0];//当前最大值
        for(int i=1; i < nums.length; i++){
            preMax = Math.max(nums[i]+preMax,nums[i]);
            maxSum = Math.max(preMax,maxSum);
        }
        return maxSum;
    }