剑指Offer 42—连续子数组的最大和

剑指Offer 42—连续子数组的最大和,第1张

力扣

题意

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。

求所有子数组的和的最大值。

要求时间复杂度为O(n)。

解题思路—动态规划

所有子数组的情况无非就是以其中某个数字结尾的,肯定有一个子数组是符合我们的要求的。

动态规划解析:

  • 状态定义: 假设动态规划列表 dp ,dp[i] 代表以元素 nums[i] 为结尾的连续子数组(有很多个)最大和。

  • 转移方程: 若  dp[i−1]≤0 ,说明  dp[i−1] 对 dp[i] 产生负贡献,即 dp[i-1] + nums[i] 还不如 nums[i]本身大。

    • 当 dp[i - 1] > 0 时:执行 dp[i] = dp[i-1] + nums[i];
    • 当 dp[i−1]≤0  时:执行 dp[i] = nums[i];
  • 初始状态: dp[0] = nums[0],即以 nums[0] 结尾的连续子数组最大和为nums[0] 。

  • 返回值: 返回 dp列表中的最大值,代表全局最大值。

降低空间复杂度 

  • 由于 dp[i] 只与 dp[i-1] 和 nums[i] 有关系,因此可以将原数组 nums 用作 dp列表,即直接在 nums上修改即可。

  • 由于省去 dp 列表使用的额外空间,因此空间复杂度从 O(N) 降至 O(1) 。

C++实现
class Solution 
{
public:
    int maxSubArray(vector& nums) 
    {
        int res=nums[0];//永存存放子数组的最大和
        for(int i=1;i0?nums[i-1]+nums[i]:nums[i];
            res=nums[i]>res?nums[i]:res;
        }
        return res;
    }
};

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存