力扣 53. 最大子数组和

95 阅读1分钟

🔗 leetcode.cn/problems/ma…

题目

  • 给定一个数组,有正数,有复数,返回子序列之和的最大值

思路

  • 这个题目《编程珠玑》讲过,思路从普通的模拟,到 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;
        
    }
};