题目:
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
示例 1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
**解释:**连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入: nums = [1]
**输出:**1
示例 3:
输入: nums = [5,4,-1,7,8]
**输出:**23
提示:
-
1 <= nums.length <= 10^5 -
-10^4 <= nums[i] <= 10^4
题解:
1.核心思想:(动态规划)
从左到右扫描时,时刻维护一个"当前子数组",并决定:
- 如果加上当前数字能让子数组变大,就加上;
- 如果加上反而变小,就丢掉前面的,从当前数字重新开始。
同时,每走一步,都记录下目前为止见到的最大和。
2.核心代码:
cpp
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
-
pre表示:以当前元素结尾的连续子数组的最大和。(注意:必须包含当前元素) -
maxAns表示:全局最大和,初始设为数组的第一个元素(不能设为 0,详见下文的要点)。
答案:
cpp
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre=0;
int maxAns=nums[0];
for(int i=0;i<nums.size();i++){
pre=max(pre+nums[i],nums[i]);
maxAns=max(maxAns,pre);
}
return maxAns;
}
};
要点:
1.为什么 maxAns 初始为 nums[0] 而不是 0?
如果数组全是负数,比如 [-5, -2, -1],最大子数组和应该是-1。但是如果 maxAns 初始为 0,那么 max(0, -5) = 0,会错误地返回 0。