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

#53. Maximum Subarray

时间:2017-08-16 15:18:27      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:[1]   example   时间   subarray   算法   nlog   开始   span   nlogn   

题目描述:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

 

分析:

  最大子串和计算。典型的动态规划问题求解。假定数组为a[10],该算法最为简单的计算方法是直接二重循环遍历数组,分别计算从a[0],a[0]到a[1],a[0]到a[2],……a[0]到a[9],a[1]到a[2],a[1]到a[3]……a[1]到a[9],……a[8]到a[9],a[9]的所有情况和的最大值,并返回,时间复杂度为o(n^2)。稍微简化采用分治方法,分别计算数组前一半,后一半,中间部分产生的最大子串和,返回最大值,时间复杂度为o(nlogn)。动态规划方法,即采用思想:遍历数组并进行加和,任何一次和为负的情况都不能对后续子串产生有益的增益,则直接丢弃负子串项,从新起点开始重新计算子串和。如-2,1,3,遍历到-2时,当前和为负,则后续直接遍历1得到和为1,会比遍历-2,1得到-1的结果要更优,则直接丢弃-2,从1重新开始计算。

 

代码:

  这里的代码只给出了动态规范的方案,后续可给出其余两种方案的代码实现。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int length = nums.size();
        int maxsum = nums[0];
        int cursum = 0;
        for(int i = 0; i < length; i++) {
            cursum += nums[i];
            if(cursum > maxsum)
                maxsum = cursum;
            if(cursum < 0)
                cursum = 0;
        }
        return maxsum;
    }
};

 

#53. Maximum Subarray

标签:[1]   example   时间   subarray   算法   nlog   开始   span   nlogn   

原文地址:http://www.cnblogs.com/scu-cjx/p/7373177.html

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