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

相关推荐
琢磨先生David2 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
超级大福宝3 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
Charlie_lll3 天前
力扣解题-88. 合并两个有序数组
后端·算法·leetcode
菜鸡儿齐3 天前
leetcode-最小栈
java·算法·leetcode
zephyr053 天前
DP 从放弃到拿捏:一份持续更新的动态规划题解清单(一)
算法·动态规划
Frostnova丶3 天前
LeetCode 1356. 根据数字二进制下1的数目排序
数据结构·算法·leetcode
mjhcsp3 天前
C++轮廓线 DP:从原理到实战的深度解析
开发语言·c++·动态规划
.格子衫.3 天前
031动态规划之数位DP——算法备赛
算法·动态规划
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
样例过了就是过了3 天前
LeetCode热题100 环形链表 II
数据结构·算法·leetcode·链表