码迷,mamicode.com
首页 > 其他好文 > 详细

第一篇

时间:2019-02-26 13:10:39      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:最大和   元素   sum   vector   lock   tor   ++   影响   +=   

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);
    }
};

第一篇

标签:最大和   元素   sum   vector   lock   tor   ++   影响   +=   

原文地址:https://www.cnblogs.com/lyc1226/p/10419202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!