zoukankan      html  css  js  c++  java
  • Leetcode 53

    Leetcode 53

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

    输入: [-2,1,-3,4,-1,2,1,-5,4],

    输出: 6

    解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

    1. 动态规划

    对第n个数来说,看前面对自己是否有积极影响
    dp[i] = max{A[i], dp[i-1]+A[i]}

    
    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            //动态规划
            //sum是以i结尾的最大值
            int sum = 0;
            int res = INT_MIN;
            for(int i=0;i<nums.size();i++)
            {
               
                sum+=nums[i];
               
                if(sum>res)
                    res = sum;
                
                 if(sum<0) sum=0;
            }
            return res;
            
        }
    };
    
    1. 分治法

    最大连续子序列和要么出现在数组左半部分,要么出现在数组右半部分,要么横跨左右两半部分。因此求出这三种情况下的最大值就可以得到最大连续子序列和。

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            //分治法
            return rec(nums,0,nums.size()-1);
            
        }
        
        int rec(vector<int>& nums,int left,int right)
        {
            if(left>=right) return nums[left];
            
            int m = (left+right)/2;
            
            int lmax = rec(nums,left,m-1);
            int rmax = rec(nums,m+1,right);
            int mmax = nums[m];
            int t = mmax;
            for(int i=m-1;i>=0;i--)
            {
                t+=nums[i];
                if (t>mmax) mmax = t;
            }
            t = mmax;
            for(int i=m+1;i<=right;i++)
            {
                t+=nums[i];
                if (t>mmax) mmax = t;
            }
            if(lmax<rmax) lmax = rmax;
            return max(lmax,mmax);
        }
    };
    
  • 相关阅读:
    java学习day08--面向对象--继承+方法重写+static关键字
    java学习day07--面向对象--封装+this关键字+构造器
    java学习day06-面向对象--类和对象
    依赖管理
    NSQ消息队列
    logger包
    time包
    fmt包
    Go_Protobu
    Go_性能优化
  • 原文地址:https://www.cnblogs.com/lyc1226/p/10419202.html
Copyright © 2011-2022 走看看