题目描述
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为O(n)。
样例
Input:[1, -2, 3, 10, -4, 7, 2, -5]
Output:18
解题思路
-
描述
这种题目一看就是动态规划,难点在于如何定义数组元素的意义和状态转换。
假定动态规划数组为s[n+1]。
s[i] 定义为 以n[i-1]为子数组结尾的最大值
s[i+1] 的取值情况为(对应整型数组元素n[i+1]):
- 如果 s [ i ] ≤ 0 s[i] \leq 0 s[i]≤0 ,那么 s [ i + 1 ] = n [ i + 1 ] s[i+1] = n[i+1] s[i+1]=n[i+1]。(子数组加上n[i+1]值会更小,因此取值n[i+1],才是最大值)
- 如果 s [ i ] > 0 s[i] > 0 s[i]>0 ,那么 s [ i + 1 ] = n [ i + 1 ] + s [ i ] s[i+1] = n[i+1] + s[i] s[i+1]=n[i+1]+s[i]。
初始化s[1] = 0。
实现和描述略有不同。
-
实现代码:
int maxSubArray(vector<int>& nums) { int s = 0,res = INT_MIN; for(int i=0;i<nums.size();i++) { if(s <= 0) s = 0; s += nums[i]; res = max(s,res); } return res; }