53.最大子序和

Posted yh-simon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了53.最大子序和相关的知识,希望对你有一定的参考价值。

技术图片
技术图片

解法1

思路

  • 数组中的每个元素 依次 作为子序的头元素 ,枚举各自构成子序的结果
  • 双for O(n^2)
  • 160 ms

代码

/**
     * 双for O(n^2) 160ms
     * @param nums
     * @return
     */
    public int maxSubArray(int[] nums) {
        int ans=nums[0],len=nums.length;
        for(int i=0;i<len;i++){
            int sum=nums[i];
            ans=Math.max(ans, sum);
            for(int j=i+1;j<len;j++){
                sum+=nums[j];
                ans=Math.max(ans, sum);
            }
        }
        return  ans;
    }

优解 (动态规划)

思路

作者:lizhiqiang-3

技术图片

技术图片
技术图片
技术图片

代码

/**
     * 动态规划
     * 1ms   O(n)
     * @param nums
     * @return
     */
    public int maxSubArray2(int[] nums){
        int len=nums.length;
        if(len==0) return 0;
        int[] dps=new int[len];
        dps[0]=nums[0];
        for(int i=1;i<len;i++){
            if(dps[i-1]>=0){
                dps[i]=dps[i-1]+nums[i];
            }else{
                dps[i]=nums[i];
            }
        }

        int ans=dps[0];
        for(int dp:dps){
            ans=Math.max(ans, dp);
        }
        return ans;
    }

优化

/**
     * 优化
     * @param nums
     * @return
     */
    public int maxSubArray3(int[] nums){
        int len=nums.length;
        if(len==0) return 0;
        int max=nums[0];
        int subMax=nums[0];
        for(int i=1;i<len;i++){
            if(subMax>=0){
                subMax=subMax+nums[i];
            }else{
                subMax=nums[i];
            }
            max=Math.max(max, subMax);
        }
        return max;
    }

动态规划

动态规划算法思想




以上是关于53.最大子序和的主要内容,如果未能解决你的问题,请参考以下文章

53.最大子序和

贪心——力扣53.最大子序和&&力扣122.买卖股票的最佳时机Ⅱ

1.(53)最大子序和

53.最大子序和

leetcode 每日一题 53. 最大子序和

leetcode 每日一题 53. 最大子序和