leetcode hot100 53.最大子数组和 动态规划 medium

暴力解法超出时间

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return 0

        left = 0
        maxsum = -float('inf') 

        for right in range(len(nums)):
            winsum = 0
            for i in range(right, len(nums)):
                winsum += nums[i]
                maxsum = max(winsum, maxsum)
        return maxsum

动态规划的状态定义

设 dp[i] 表示以 nums[i] 结尾的子数组的最大和:

  1. 如果dp[i-1]是负数,那么无论nums[i]是正数还是负数,以nums[i]结尾的子数组的最大和dp[i] 为nums[i]。 (不要累加前面的负数结果)
  2. 如果dp[i-1]是正数,那么无论nums[i]是正数还是负数,以nums[i]结尾的子数组的最大和号dp[i] 为dp[i-1]+nums[i]。 (累加前面的正数结果)

即每轮迭代 dp[i] 的更新为:dp[i] = max(nums[i], dp[i-1] + nums[i])

再与之前的迭代结果比较: maxsum = max(dp[i] ,maxsum)

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if not nums:
            return 0

        dp = [0] * len(nums)
        dp[0] = nums[0]
        maxsum = dp[0]

        for i in range(1,len(nums)):
            dp[i] = max(nums[i], dp[i-1] + nums[i])

            maxsum = max(maxsum, dp[i])

        return maxsum
        

时间复杂度:O(n),其中 n 是数组的长度,因为我们只遍历一遍数组。

空间复杂度:O(n),需要存储 dp 数组

相关推荐
YuTaoShao1 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
TracyCoder1233 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
草履虫建模9 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
YYuCChi13 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
VT.馒头14 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
罗湖老棍子16 小时前
括号配对(信息学奥赛一本通- P1572)
算法·动态规划·区间dp·字符串匹配·区间动态规划
一只小小的芙厨16 小时前
寒假集训笔记·树上背包
c++·笔记·算法·动态规划
金融RPA机器人丨实在智能17 小时前
2026动态规划新风向:实在智能Agent如何以自适应逻辑重构企业效率?
算法·ai·重构·动态规划
问好眼18 小时前
【信息学奥赛一本通】1275:【例9.19】乘积最大
c++·算法·动态规划·信息学奥赛
不穿格子的程序员18 小时前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法