给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
看着有点像我之前整理的一道题目:乘积最大子数组
https://blog.csdn.net/qq_42604176/article/details/108876793
先用DP试试:
1、总目标:在左端点为0,右端点为nums.size的连续区间中找到最大和
2、子问题:在左端点为0,右端点为i的连续区间中找到最大和
3、分析状态定义是否符合最优子结构
nums:[-2,1,-3,4,-1,2,1,-5,4]
f: [-2 ,1, 1,4, 3,5,6,6, 6]
对于nums数组中的每个数,有两种选择,1个是把它纳入f中,还有一种是不纳入f中(然后从nums[i]重新开始记录)
状态转移方程:f[i] = max(f[i-1]+nums[i],nums[i])
AC代码:
class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size(),ans=nums[0];vector<int> f(n, 0);f[0]=nums[0];for(int i=1;i<n;++i){f[i] =max(nums[i],nums[i]+f[i-1]);ans = max(ans,f[i]); //在每个不同长度的区间中分别找到最大值,并且取这些最大值中的最大值}return ans;}
};
第一次错误的原因是没有对f[0]赋初值。
不过感觉时间和空间消耗都比较大,让俺想想是为啥。。。
有无大佬能讲解一下优化思路,或者待我学成归来再写优化(doge)