力扣 53. 最大子数组和
🔗 https://leetcode.cn/problems/maximum-subarray
题目
- 给定一个数组,有正数,有复数,返回子序列之和的最大值
思路
- 这个题目《编程珠玑》讲过,思路从普速的模拟,到 presum 优化,到代码很容易写错的分治,到最后的扫描,这过程也是历经了好几年
- 扫描的思路就是,如果前面子序列之和大于零,就保留,如果小于零,就不要前面的子序列,重新开始统计,记录这过程中的最大值
代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0];
int presum = nums[0];
for (int i = 1; i < nums.size(); i++) {
if (presum > 0) presum += nums[i];
else presum = nums[i];
ans = max(ans, presum);
}
return ans;
}
};