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);
    }
};
原文地址:https://www.cnblogs.com/lyc1226/p/10419202.html