Problem:53. Maximum Subarray
Question
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.
思路
- 动态规划
状态方程: sum(i) = max{ sum(i-1)+a(i), a(i) }
sum(i)是以i结尾和最大的连续子序列,a(i)是数组的第i个值 - 从第一个数开始,往后一直累加,如果累加的和小于0,则重新从下一个位置开始累加,不断更新最大值。
代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int largest = nums[0];
vector<int> dp;
dp.push_back(nums[0]);
for (int i = 1; i < nums.size(); i++) {
dp.push_back(nums[i]+dp[i-1] > nums[i] ? nums[i] + dp[i - 1] : nums[i]);
largest = largest > dp[i] ? largest : dp[i];
}
return largest;
}
};
比较直接简单的代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int cursum = 0;
int ans = nums[0];
for (int i = 0; i < nums.size(); i++) {
cursum += nums[i];
ans = max(cursum, ans);
cursum = max(cursum, 0);
}
return ans;
}
};