贪心 解题模板

适用场景

局部最优→全局最优的问题(区间调度、跳跃游戏、股票买卖)

常见模式

区间调度

 
# 最少移除 = 总数 - 最多不重叠
 
intervals.sort(key=lambda x: x[1])  # 按右端点排序
 
count, end = 1, intervals[0][1]
 
for s, e in intervals[1:]:
 
    if s >= end:
 
        count += 1
 
        end = e
 

区间覆盖 / 跳跃

 
# 能否跳到终点
 
max_reach = 0
 
for i in range(n):
 
    if i > max_reach: return False
 
    max_reach = max(max_reach, i + nums[i])
 
# 最少跳跃次数
 
jumps = cur_end = max_pos = 0
 
for i in range(n-1):
 
    max_pos = max(max_pos, i + nums[i])
 
    if i == cur_end:
 
        jumps += 1
 
        cur_end = max_pos
 

股票买卖

 
# 单次交易:维护最低价
 
min_price = float('inf')
 
max_profit = 0
 
for p in prices:
 
    min_price = min(min_price, p)
 
    max_profit = max(max_profit, p - min_price)
 
# 多次交易:累加所有上涨
 
profit = 0
 
for i in range(1, len(prices)):
 
    if prices[i] > prices[i-1]:
 
        profit += prices[i] - prices[i-1]
 

复杂度总结

模式时间空间典型题
区间调度O(n log n)O(1)无重叠区间、气球引爆
跳跃游戏O(n)O(1)55、45
股票买卖O(n)O(1)121、122
任务调度O(n)O(1)621

关键要点

  • 贪心需要证明!常用交换论证法

  • 按右端点排序的区间调度是标准贪心

  • 跳跃游戏 II = BFS 的贪心实现

→ 查看该分类题目:LeetCode学习路线图 > 十一、贪心


关联题型

关联题型常见结合方式典型题目
动态规划贪心是DP的特例122买卖股票II, 55跳跃游戏
排序排序 + 贪心选择452箭气球, 435无重叠
堆维护贪心策略621任务调度器