题目描述
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为O(n)。
样例
输入:[1, -2, 3, 10, -4, 7, 2, -5]
输出:18
问题分析
此题O(n)的解法是用动态规划。dp[i]是以i结尾的最大子序和,如果dp[i-1]小于0,那么dp[i]等于nums[i]才能使其最大,如果加上前面的dp[i-1]的话会更小。否则dp[i]等于dp[i-1]加上nums[i]。最终的结果是dp数组中最大的数,所以遍历过程中一直更新最大值ans。最终遍历完后返回最大子序和ans。
代码实现
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size() == 1)
return nums[0];
int n = nums.size();
vector<int> dp(n, -1);
dp[0] = nums[0];
int ans = dp[0];
for(int i = 1; i < n; i++){
if(dp[i - 1] < 0)
dp[i] = nums[i];
else
dp[i] = dp[i - 1] + nums[i];
ans = max(ans, dp[i]);
}
return ans;
}
};