题. 连续子数组的最大和
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。
数组中一个或连续的多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为 O(n)。
数据范围
数组长度 [1,1000]。
数组内元素取值范围 [−200,200]。
样例
输入:[1, -2, 3, 10, -4, 7, 2, -5]
输出:18
【题解】-- 动态规划
当前0~i的数组中 , nums[i]参与的子数组的最大和,只有两种情况:
- 与前面的子数组的最大和相加, PreMaxSum加上nums[i],
- 不与前面的子数组相加,单独自己成为一个新的子数组。
要求最大和,那么取两种情况中最大的和。
题目要求的是连续子数组的和,那么PreMaxSum必须也是nums[i-1]参与的数组和的最大值;
那么我们定义dp[i] 是当前0~i的数组中,索引为i的数字参与的数组和的最大值;
上述情况可以定义为
dp[i] = max(dp[i-1]+nums[i],nusm[i]);
复杂度分析:
动态规划的总时间复杂度为O(n)。
C++代码实现:
class Solution {
public:
int dp[100010];
int maxSubArray(vector<int>& nums) {
nums.insert(nums.begin(),0);
int ans = -9999999;
for(int i = 1;i<nums.size();i++){
dp[i] = max(dp[i-1]+nums[i],nums[i]);
ans = max(ans,dp[i]);
}
return ans;
}
};