zoukankan      html  css  js  c++  java
  • 剑指 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;
        }
    }
  • 相关阅读:
    5.18英语
    5.18
    5.17
    单源点最短路模板
    5.16
    mock.js进行接口mock
    docker-compose安装和使用
    docker常用命令
    docker安装和使用(win10家庭版)
    ES6基础(2)-const
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14422171.html
Copyright © 2011-2022 走看看