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

    科技2022-07-11  98

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

    Processed: 0.012, SQL: 8