Maximum Subarray
2016-04-10 19:51
330 查看
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.
当我们从头到尾遍历这个数组的时候,对于数组里的一个整数,它有几种选择呢?
它只有两种选择:
1、加入之前的SubArray;
2. 自己另起一个SubArray。那什么时候会出现这两种情况呢?
如果之前SubArray的总体和大于0的话,我们认为其对后续结果是有贡献的。这种情况下我们选择加入之前的SubArray
如果之前SubArray的总体和为0或者小于0的话,我们认为其对后续结果是没有贡献,甚至是有害的(小于0时)。这种情况下我们选择以这个数字开始,另起一个SubArray。
设状态为{f[j]},表示以{S[j]}结尾的最大连续子序列和,则状态转移方程如下:
![](http://img.blog.csdn.net/20160410195005552)
我的结果如下:
![](http://img.blog.csdn.net/20160410195439730)
有优化代码求扫二维码进QQ群交流 ^_^ !
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.
当我们从头到尾遍历这个数组的时候,对于数组里的一个整数,它有几种选择呢?
它只有两种选择:
1、加入之前的SubArray;
2. 自己另起一个SubArray。那什么时候会出现这两种情况呢?
如果之前SubArray的总体和大于0的话,我们认为其对后续结果是有贡献的。这种情况下我们选择加入之前的SubArray
如果之前SubArray的总体和为0或者小于0的话,我们认为其对后续结果是没有贡献,甚至是有害的(小于0时)。这种情况下我们选择以这个数字开始,另起一个SubArray。
设状态为{f[j]},表示以{S[j]}结尾的最大连续子序列和,则状态转移方程如下:
class Solution { public: int maxSubArray(vector<int>& nums) { int len = nums.size(); if(len <= 0){ return 0; } int nLocalOpt = nums[0]; int nGlobalOpt = nLocalOpt; for(int i=1; i<len; i++){ nLocalOpt = nLocalOpt + nums[i]; if(nLocalOpt <= nums[i]){ nLocalOpt = nums[i]; } if(nGlobalOpt <= nLocalOpt){ nGlobalOpt = nLocalOpt; } } return nGlobalOpt; } };
我的结果如下:
有优化代码求扫二维码进QQ群交流 ^_^ !
相关文章推荐