LeetCode 53:最大子序和解题以及优化思路(第一次独立刷题记录)

给定一个整数数组 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)

猜你喜欢

转载自blog.csdn.net/qq_42604176/article/details/108913284