老样子,先康康力扣官方是怎么描述这个题的
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入:[-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
我刚开始看到这个题的思路是这样的:只要找到每个数的最大连续子数组就行了呀
于是就使用暴力解法:使用双重循环来遍历所有的情况,找到最大值
分析这个算法的时间复杂度为O(n2),空间复杂度为O(1);
那么要如何优化这个算法呢?这就需要动态规划的知识了
这个题可以分化为这样的子问题:假设现在找到了i-1个数的最大值,如何确定加入第i个值之后是否最大?只要比较前i-1个数的值的和与第i个数的值进行比较,取最大值即可。
根据这个思路,可以写出下面的代码
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
//使用动态规划
int ans=nums[0];
int sum=0;//记录以nums[i]结尾的连续子数组最大值
for(int i=0;i<nums.size();i++)
{
sum=max(sum+nums[i],nums[i]);
ans=max(ans,sum);
}
return ans;
}
};
可以分析得到这个算法的时间复杂度为O(n),空间复杂度为O(1);