标签:[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; } };
标签:[1] example 时间 subarray 算法 nlog 开始 span nlogn
原文地址:http://www.cnblogs.com/scu-cjx/p/7373177.html