LintCode_41 最大子数组

题目

给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

 注意事项

子数组最少包含一个数

样例

给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6

挑战 

要求时间复杂度为O(n)

思路

动态规划解决 可以把时间复杂度降低为O(n)

假设当前数组为a[n];

假设已经求出了第i项的最大子数组和Max和包括第i项的最大子数组和S(i);

求第i+1项的最大子数组

if(S(i) >= 0) S(i + 1) = S(i) + a[i + 1];

else S(i + 1) = a[i + 1];

if(max <S(i)) max = S(i);

 

如果i = 0; S(0) = a[0]; max = a[0];

C++代码

 1 int maxSubArray(vector<int> nums) {
 2         // write your code here
 3         int max = nums[0];
 4         int s = nums[0];
 5         for(int i = 1; i < nums.size(); ++i)
 6         {
 7             if(s >= 0)
 8             {
 9                 s += nums[i];
10             }
11             else
12             {
13                 s = nums[i];
14             }
15             if(max < s) max = s;
16         }
17         return max;
18         
19 }
View Code

 

 

posted @ 2016-05-05 12:20  红岸的电波  阅读(115)  评论(0编辑  收藏  举报