LintCode_41 最大子数组
题目
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
注意事项
子数组最少包含一个数
样例
给出数组[−2,2,−3,4,−1,2,1,−5,3]
,符合要求的子数组为[4,−1,2,1]
,其最大和为6
挑战
View Code
要求时间复杂度为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 }