🔗 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;}
};