news 2026/7/13 12:27:10

贪心 vs 动态规划:LeetCode 5道同题异构对比,详解选择依据与性能差异

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心 vs 动态规划:LeetCode 5道同题异构对比,详解选择依据与性能差异

贪心 vs 动态规划:5道LeetCode同题异构对比与算法选择策略

1. 算法本质差异与选择逻辑

当面对LeetCode中的最优化问题时,我们常常需要在贪心算法和动态规划之间做出选择。这两种算法看似相似,实则存在根本性差异:

贪心算法的核心在于局部最优推导全局最优,它通过每一步的贪婪选择构建解决方案,特点是:

  • 自顶向下解决问题
  • 无后效性(当前选择不影响后续子问题)
  • 通常时间复杂度更低(O(n)或O(nlogn))

动态规划则采用状态转移方程解决问题,其特征为:

  • 自底向上构建解决方案
  • 具有最优子结构性质
  • 需要存储中间状态(可能带来更高空间复杂度)

关键判断标准:问题是否具有贪心选择性质。若能证明局部最优能导致全局最优,则贪心算法适用;若需要比较所有可能的子问题组合,则必须使用动态规划。

2. 经典题目对比分析

2.1 摆动序列(LeetCode 376)

贪心解法

def wiggleMaxLength(nums): if len(nums) < 2: return len(nums) prev_diff = nums[1] - nums[0] count = 2 if prev_diff != 0 else 1 for i in range(2, len(nums)): curr_diff = nums[i] - nums[i-1] if (curr_diff > 0 and prev_diff <= 0) or (curr_diff < 0 and prev_diff >= 0): count += 1 prev_diff = curr_diff return count

时间复杂度:O(n)
空间复杂度:O(1)

动态规划解法

def wiggleMaxLength(nums): if not nums: return 0 up = down = 1 for i in range(1, len(nums)): if nums[i] > nums[i-1]: up = down + 1 elif nums[i] < nums[i-1]: down = up + 1 return max(up, down)

时间复杂度:O(n)
空间复杂度:O(1)(优化后)

对比结论

  • 贪心法通过统计峰值数量直接解决问题
  • 动态规划维护了两个状态变量(上升/下降序列长度)
  • 此问题中贪心法更直观,但两者时间复杂度相同

2.2 买卖股票最佳时机II(LeetCode 122)

贪心解法

def maxProfit(prices): profit = 0 for i in range(1, len(prices)): if prices[i] > prices[i-1]: profit += prices[i] - prices[i-1] return profit

时间复杂度:O(n)
空间复杂度:O(1)

动态规划解法

def maxProfit(prices): n = len(prices) dp = [[0] * 2 for _ in range(n)] dp[0][0] = -prices[0] # 持有股票 dp[0][1] = 0 # 不持有 for i in range(1, n): dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]) dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]) return dp[-1][1]

时间复杂度:O(n)
空间复杂度:O(n)(可优化为O(1))

对比结论

  • 贪心法利用"所有上升区间累加"的特性
  • 动态规划模拟了状态转移过程
  • 贪心法更简洁高效,但动态规划框架更通用

3. 算法选择决策矩阵

问题特征贪心算法适用性动态规划适用性
具有贪心选择性质✅ 优先选择⚠️ 可能过度设计
需要比较所有子问题组合❌ 无法保证最优✅ 必须使用
时间复杂度要求严格✅ 通常更优⚠️ 可能较高
空间复杂度限制严格✅ 通常更优⚠️ 需要状态存储
问题可分解为独立子问题✅ 表现良好⚠️ 可能不必要

4. 贪心可行但动规不推荐的情况

4.1 分发糖果(LeetCode 135)

虽然可用动态规划解,但贪心的双向遍历更高效:

def candy(ratings): n = len(ratings) candies = [1] * n # 左到右遍历 for i in range(1, n): if ratings[i] > ratings[i-1]: candies[i] = candies[i-1] + 1 # 右到左遍历 for i in range(n-2, -1, -1): if ratings[i] > ratings[i+1]: candies[i] = max(candies[i], candies[i+1] + 1) return sum(candies)

4.2 跳跃游戏(LeetCode 55)

贪心法通过维护最大覆盖范围解决问题:

def canJump(nums): max_reach = 0 for i in range(len(nums)): if i > max_reach: return False max_reach = max(max_reach, i + nums[i]) return True

4.3 加油站(LeetCode 134)

贪心法通过一次遍历确定起点:

def canCompleteCircuit(gas, cost): total_tank = curr_tank = start = 0 for i in range(len(gas)): total_tank += gas[i] - cost[i] curr_tank += gas[i] - cost[i] if curr_tank < 0: start = i + 1 curr_tank = 0 return start if total_tank >= 0 else -1

5. 性能对比与实战建议

时间复杂度对比

  • 贪心算法通常为O(n)或O(nlogn)(主要来自排序)
  • 动态规划通常为O(n)或O(n²)(取决于状态转移方程)

空间复杂度对比

  • 贪心算法通常为O(1)或O(n)(如果需要额外存储)
  • 动态规划通常为O(n)或O(n²)(可优化为O(1)或O(n))

实战建议

  1. 首先分析问题是否具有贪心选择性质
  2. 尝试构建反例验证贪心算法的正确性
  3. 当贪心法不适用时,考虑动态规划的三要素:
    • 最优子结构
    • 状态转移方程
    • 边界条件
  4. 对于特定问题(如股票系列),两种方法都可能适用,但贪心通常更简洁

在算法竞赛或面试中,理解这两种算法的本质差异并能快速判断适用场景,将显著提升解题效率。建议通过大量练习培养对问题特征的敏感度,形成算法选择的直觉。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 12:26:46

STM32F103 S型加减速算法实战:500次加速平滑曲线生成与PWM频率控制

STM32F103 S型加减速算法实战&#xff1a;500次加速平滑曲线生成与PWM频率控制 在工业自动化、3D打印和精密仪器控制领域&#xff0c;步进电机的运动平滑性直接影响设备性能。传统梯形加减速算法由于加速度突变会产生机械振动&#xff0c;而S型加减速通过连续变化的加速度曲线完…

作者头像 李华
网站建设 2026/7/13 12:26:40

基于局部高斯拟合的医学图像分割算法解析

1. 项目概述&#xff1a;基于局部高斯分布拟合的活动轮廓模型在医学影像分析和工业检测领域&#xff0c;图像分割一直是核心难题。传统阈值法和边缘检测对噪声敏感&#xff0c;而深度学习需要大量标注数据。我们团队开发的这种基于变分水平集的主动轮廓模型&#xff0c;通过局部…

作者头像 李华
网站建设 2026/7/13 12:26:37

【深度学习】一维卷积与二维卷积:从原理到实战的跨模态应用解析

1. 卷积的本质&#xff1a;从信号处理到深度学习第一次接触卷积这个概念时&#xff0c;我完全被数学公式绕晕了。直到有天在厨房切菜突然开窍——这不就是菜刀在砧板上滑动的过程吗&#xff1f;在信号处理领域&#xff0c;卷积本质上是两个函数相互作用产生第三个函数的数学运算…

作者头像 李华
网站建设 2026/7/13 12:26:06

Unity机器人仿真性能优化:从原理到实战的完整指南

1. 项目概述&#xff1a;为什么机器人仿真需要性能优化&#xff1f;做机器人环境仿真&#xff0c;尤其是用Unity来做&#xff0c;性能优化和调试从来都不是一个“可选项”&#xff0c;而是一个贯穿始终的“必选项”。这和你做一个普通的3D游戏或者交互应用有本质区别。在游戏里…

作者头像 李华
网站建设 2026/7/13 12:25:02

硬盘数据恢复实战指南:从损坏检测到完整提取的技术方案

最近在技术社区看到不少关于数据恢复的求助帖&#xff0c;有位网友的经历特别典型&#xff1a;一块进水损坏的电脑硬盘&#xff0c;多次维修未果&#xff0c;核心诉求不是硬件修复&#xff0c;而是抢救里面的重要数据。这种"硬件可弃&#xff0c;数据必救"的场景在企…

作者头像 李华
网站建设 2026/7/13 12:25:01

3分钟解决GitHub下载慢的终极加速方案:国内开发者的效率革命

3分钟解决GitHub下载慢的终极加速方案&#xff1a;国内开发者的效率革命 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 还在为Git…

作者头像 李华