给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
*做题没有思路的时候,先举几个例子推敲总结经验
思路
对于最大最小、连续、、等等首先想到动态规划的解决思路
1、确认原问题和子问题
原问题为第n个索引之前具有最大和的连续子数组
子问题为第1个、第2个、。。。第n-1个索引之前 具有最大和的连续子数组
2、确认状态
第 i 个状态即为第 i 个索引之前 具有最大和的连续子数组
3、确认边界状态的值
第 1 个索引之前 具有最大和的连续子数组就是nums[0]
4、确定状态转移方程
由第 i-1 个状态转为第 i 个状态,即扩大了数组的范围,
先举例子:
[-2,1,-3,4,-1,2,1,-5,4]
1、第i-1个状态:一开始先选定-2,则当前最大和max = -2
2、再看下一个值是 1,我们能做得选择就是:
- 只留-2,因为我们要往后推,所以这个选择去掉,在下面的两个选择选最大的
- -2+1
- 只留1,因为-2留着只有减益的效果,所以第 i 个状态值就是1
3、在自己往后推,发现规律就是:
状态方程:f(i) = max( f(i-1) + nums[i] , nums[i]);
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ret=nums[0];
int max1=0;
int dp1=0;
for(int i=0;i<nums.size();i++){
max1 = max(dp1+nums[i],nums[i]);
if(max1>=ret)
ret=max1;
dp1 = max1;
}
return ret;
}
};