本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
思路
这道题需要求的是具有最大和的连续子数组。返回的是那个最大和。考虑对于数组的每一个元素,当遍历到这个元素时,要么将它加入到之前的连续子数组里面去,要么以它为起点,只有这两种选择。那么选择的依据当然是这个元素加入进去之后,那个连续子数组的和与单独这个元素相比,谁更大。如果加进去之后更大,那就加进去,如果单独自己更大,那就以它为起点,重新开始一个新的连续子数组。
按照这样的逻辑遍历数组,与此同时,我们需要设置一个变量来保存连续数组的最大和。因为这个最大值可能出现在数组的中间等任何位置,因此需要记录一下。
代码
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;
}
};