题目:
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
说明:
- 1 <= arr.length <= 10^5
- -100 <= arr[i] <= 100
解题方法:
这道题是一道非常简单的动规题,也是很常见的题目。但是我觉得做题目要先易后难,还有就是要思考解题思路,应该从什么地方入手。如果不思考解题步骤的话,很容易就变成背题,时间长了就会忘记。另外遇到变形题目就会无从下手,就像神经网络训练发生过拟合,没有提炼到真正的规律。
先上代码和结果:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxv=nums[0];
int cur=nums[0];
for(int i=1;i<nums.size();i++)
{
cur+=nums[i];
if(cur<nums[i])
cur=nums[i];
if(cur>maxv)
maxv=cur;
}
return maxv;
}
};
运行结果:
![](https://img.haomeiwen.com/i11138240/6e5e695eb4444e8f.png)
我的思考过程:
- 考虑数组长度为1:当前数组内最大值cur=num[0];
- 考虑数组长度为2:这个时候连续最大子数组有两种可能:cur=max{cur+num[1],num[1]};
- 考虑数组长度为3:这个时候连续最大子数组考虑上一步的结果:
(1)如果上一步最大值是num[0]+num[1],那么cur=max{num[0]+num[1]+num[2],num[2]};(2)如果上一步最大值是num[1],那么最大值cur=max{num[1]+num[2],num[2]};
归纳规律就是:cur=max(cur,num[i])。- 但是cur只是当前最大值,不是整个数组的最大值,所以还需要在每次更新cur以后,要判断是否大于maxv,大于的话则更新maxv。
网友评论