题目
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100
动态规划
- 状态定义:dp[i]表示必须以nums[i]结尾的连续子串的最大和
- 转移方程:dp[i-1]<=0时,dp[i]=nums[i] 前序是负贡献,那不如自己重新开始;dp[i-1]> 0时,dp[i]=dp[i-1]+nums[i] 前序是正贡献,那自己直接加入
- 初试状态:dp[0]=nums[0]
- 返回值:返回dp[]中的最大值
时间复杂度O(N):需要遍历一次数组
空间复杂度O(1):辅助空间为常数个
class Solution {
public:
/*
状态定义:dp[i]表示必须以nums[i]结尾的连续子串的最大和
转移方程:
dp[i-1]<=0时,dp[i]=nums[i] 前序是负贡献,那不如自己重新开始
dp[i-1]> 0时,dp[i]=dp[i-1]+nums[i] 前序是正贡献,那自己直接加入
初试状态:dp[0]=nums[0]
返回值:返回dp[]中的最大值
*/
int maxSubArray(vector<int>& nums) {
if(nums.size()==0)
return 0;
int pre, cur, maxsum;
pre = nums[0];
maxsum = pre;
for(int i=1; i<nums.size(); i++){
if( pre > 0 ){
cur = pre + nums[i];
}else{
cur = nums[i];
}
if( maxsum < cur )
maxsum = cur;
pre = cur;
}
return maxsum;
}
};