剑指 Offer 42. 连续子数组的最大和
题意:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解题思路:
利用动态规划思想
- 定义count用来存储数组的值,寻找最大值;还有一个res来存储最大值;
- 如果当前下标小于0,说明如果加进去会让res变小,那么需要先记录当前的res;
- 如果count小于0,就让
count = nums[j]
,因为小于0再加上其它数是相当于减少,所以要舍弃- 直到 j 走到末尾,循环结束.
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int j = 1;
int count = nums[0];
int res = INT_MIN;
while (j < nums.size())
{
if (nums[j] < 0)
{
if (count > res)
res = count;
}
if (count < 0)
count = nums[j];
else
count += nums[j];
j++;
}
if (count > res)
res = count;
return res;
}
};
运行结果:
总结:
这道题是典型的动态规划问题,怎么样去缩减和扩大.只要想明白怎么处理count的情况,基本就可以完成;