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

动态规划的状态定义

设 dpi 表示以 numsi 结尾的子数组的最大和:

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

即每轮迭代 dpi 的更新为:dpi = max(numsi, dpi-1 + numsi)

再与之前的迭代结果比较: maxsum = max(dpi ,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 数组

相关推荐
午彦琳16 小时前
2026.9.17
数据结构·算法·leetcode
木井巳16 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
All for pursuit.19 小时前
【链表-9】146.LRU缓存
数据结构·c++·算法·leetcode
圣保罗的大教堂19 小时前
leetcode 1477. 找两个和为目标值且不重叠的子数组 中等
leetcode
hanlin0320 小时前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
Logic10121 小时前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
圣保罗的大教堂1 天前
leetcode 3629. 通过质数传送到达终点的最少跳跃次数 中等
leetcode
圣保罗的大教堂1 天前
leetcode 1914. 循环轮转矩阵 中等
leetcode
wabs6661 天前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
alphaTao1 天前
LeetCode 每日一题 2026/9/14-2026/9/20
算法·leetcode