LeetCode 53. 最大子数组和

140 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

image.png

思路

\qquad这道题需要求的是具有最大和的连续子数组。返回的是那个最大和。考虑对于数组的每一个元素,当遍历到这个元素时,要么将它加入到之前的连续子数组里面去,要么以它为起点,只有这两种选择。那么选择的依据当然是这个元素加入进去之后,那个连续子数组的和与单独这个元素相比,谁更大。如果加进去之后更大,那就加进去,如果单独自己更大,那就以它为起点,重新开始一个新的连续子数组。
\qquad按照这样的逻辑遍历数组,与此同时,我们需要设置一个变量来保存连续数组的最大和。因为这个最大值可能出现在数组的中间等任何位置,因此需要记录一下。

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int pre=0;
        int AnsMax=nums[0];
        for(const auto &x:nums){
            pre=max(pre+x,x);  //pre记录的是,考虑了x这个值之后的最大值。
            //虽然此时这个x,未必是最终的连续子数组的元素,但是必须要算一下,因为
            //在后面求下一个x的时候,如果和更大,那么这个上一个x必须要算进去,
            //因为是连续的子数组,这一项必须要算上。
            AnsMax=max(pre,AnsMax);  //AnxMax记录的是历史最大值。也是最终返回的值。
        }
        return AnsMax;
    }
};