剑指 Offer 42. 连续子数组的最大和

 

 

这道题只有一个难点,那就是怎么定义dp[i]

我首先想dpi代表前i项的连续最大和,但这条路走不通,递推方程写不出来

其次想的是dpi代表结果数组大小为i的情况,但也走不通。

一看答案才发现,应该定义dpi为以numsi为结尾的数组

这样确实也是穷举了所有情况,而且非常好写递推

但是确实没那么容易想到

 

 然后自己写的代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int length=nums.length;
        int[] dp=new int[length];//从num0到numlength-1
        //dpi的意思是以numsi为终点的数组的最大连续和
        dp[0]=nums[0];
        int currentMax=dp[0];
        for(int i=1;i<length;i++)
        {
            if(dp[i-1]>=0)
            {dp[i]=dp[i-1]+nums[i];}
            else
            {dp[i]=nums[i];}
            currentMax=Math.max(currentMax,dp[i]);
        }
        return currentMax;
    }
}

但其实还可以优化

 

 于是代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int res = nums[0];
        for(int i = 1; i < nums.length; i++) {
            nums[i] += Math.max(nums[i - 1], 0);
            res = Math.max(res, nums[i]);
        }
        return res;
    }
}

 

posted @ 2021-02-20 16:59  将来的事  阅读(46)  评论(0编辑  收藏  举报