trending_up贪心
贪心题型:怎么识别、怎么讲、怎么练
贪心不是靠语法识别的模式,而是当某个局部选择可以被证明“安全”时,你才能放心使用它。证明通常来自交换论证或边界论证。
覆盖题量
45+
推荐起手
先明确写出你的贪心选择是什么。
高频误区
只觉得应该贪,却没有任何反例验证。
什么时候该想到这个模式
某个局部选择很自然,而且你能解释为什么拖延它不会更好。
按某个关键字排序后,后续决策 suddenly 变简单。
DP 似乎能做,但明显太重,题目也更像在考结构。
下手前的检查清单
先明确写出你的贪心选择是什么。
解释为什么任意一个最优解都能被调整成做同样选择。
确认排序是证明的一部分,还是只是实现方便。
先找反例,再决定能不能贪。
真正适合面试表达的解题步骤
1
先找出那个最能保留未来选择空间的局部决策。
2
如果排序能让这个选择被验证,就先排序。
3
说明做出贪心选择后保持了什么不变式。
4
用交换论证或证明草图说明为什么它正确。
5
最后再落成线性扫描或边界维护代码。
常见变体
区间调度
按结束时间或开始时间排序,核心是保留未来选择空间。
可达性贪心
持续维护当前最远可达边界。
资源分配
优先选择能最小化未来代价或冲突的方案。
模板预览
Python公开预览
items.sort(key=priority)
answer = 0
for item in items:
if can_take(item):
take(item)
answer = update(answer)
更像真实刷题路径的推荐题单
这组题不是随机罗列,而是按“先建立识别感,再补关键变体,最后上强度”去排,适合真的拿来做一轮 pattern 复习。
入门建立直觉
#45 Jump Game II
求到达最后一个位置的最少跳跃次数。
只有当前层扫描结束时才增加跳跃次数,而不是每次发现更远位置都加一次。
入门建立直觉
#55 Jump Game
判断是否能到达最后一个位置。
只要当前位置没有超过当前最远可达边界,就还能用 nums[i] 去继续延伸边界。
变体补齐关键状态
#56 Merge Intervals
合并所有重叠区间。
按起点排序后,是否重叠只取决于当前合并区间的右端点。
变体补齐关键状态
#435 Non-overlapping Intervals
最少删除多少区间,才能让剩余区间互不重叠。
当两个区间重叠时,结束更晚的那个通常是更差的保留对象。
高频难点压强练习
#452 Minimum Number of Arrows to Burst Balloons
用最少箭数射爆所有气球区间。
只要两个气球区间重叠,就能用同一支箭处理,因此真正重要的是重叠区间的共同边界。
高频坑点
warning
只觉得应该贪,却没有任何反例验证。
warning
按一个看起来顺眼的 key 排序,但它并不支撑正确性。
warning
把单调边界问题误判成 DP,或者反过来。
warning
只讲实现,不讲为什么贪心成立。
练习顺序建议
1
先做跳跃游戏和区间合并/删除。
2
再刷射爆气球和队列重建。
3
然后补资源预算和分配类贪心题。
4
最后再做需要较强证明的高难贪心。