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 数组

相关推荐
土司大王几秒前
LeetCode hot100——两两交换链表中的节点
算法·leetcode·职场和发展
zander2582 小时前
LeetCode 300. 最长递增子序列
算法·leetcode·深度优先
欧叶冲冲冲2 小时前
Python常见数据结构的CRUD(LeetCode高频版速查)
数据结构·python·leetcode
圣保罗的大教堂2 小时前
leetcode 3622. 判断整除性 简单
leetcode
Lyyaoo.3 小时前
【普通数组】【中等】除了自身以外数组的乘积
数据结构·算法·leetcode
圣保罗的大教堂4 小时前
leetcode 2996. 大于等于顺序前缀和的最小缺失整数 简单
leetcode
圣保罗的大教堂5 小时前
leetcode 3702. 按位异或非零的最长子序列 中等
leetcode
青 春 记 忆6 小时前
LeetCode 206. 反转链表|Python 解法详解
python·leetcode·链表
青 春 记 忆8 小时前
LeetCode 226. 翻转二叉树|Python 解法详解
python·算法·leetcode