python-leetcode-删除并获得点数

740. 删除并获得点数 - 力扣(LeetCode)

解法 1:动态规划(O(n) 时间,O(n) 空间)

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

        # 统计每个数的贡献
        points = Counter(nums)
        max_val = max(nums)  # 找到数组中的最大值
        dp = [0] * (max_val + 1)

        # 构造 dp 数组
        for num in range(max_val + 1):
            dp[num] = num * points[num]

        # 打家劫舍
        prev, curr = 0, 0
        for num in range(max_val + 1):
            prev, curr = curr, max(curr, prev + dp[num])
        
        return curr

时间复杂度O(n)(遍历 nums 统计次数 + 遍历 dp 计算)

空间复杂度O(n)(使用 dp 数组)

解法 2:优化的动态规划(O(n) 时间,O(1) 空间)

  • 空间优化 :只存储 prevcurr,减少 dp 数组占用。
python 复制代码
class Solution:
    def deleteAndEarn(self, nums: List[int]) -> int:
        if not nums:
            return 0

        points = Counter(nums)
        max_val = max(nums)
        
        prev, curr = 0, 0  # 滚动变量代替 dp 数组
        for num in range(max_val + 1):
            prev, curr = curr, max(curr, prev + num * points[num])
        
        return curr

时间复杂度O(n)

空间复杂度O(1)(只用两个变量)

总结

方法 时间复杂度 空间复杂度 适用情况
DP 数组版 O(n) O(n) 适用于小规模输入
DP 滚动变量 O(n) O(1) 推荐,适合大规模输入

最佳选择 :用 滚动变量 版本,避免 O(n) 额外空间,适合大数据处理! 🚀

相关推荐
颜酱25 分钟前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者16 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮17 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者17 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考17 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx21 小时前
CART决策树基本原理
算法·机器学习
Wect21 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway1 天前
解析残差网络 (ResNet)
算法
拖拉斯旋风1 天前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法