贪心算法解决区间调度问题的最优策略是优先选择结束时间最早的区间,具体步骤为:先按结束时间升序排序,再线性扫描并选择开始时间不早于上一个已选区间结束时间的区间。

用贪心算法解决经典区间调度问题,核心就一条:优先选结束时间最早的区间。这不是凭感觉,而是有严格证明的最优策略——早结束,才能给后面腾出最多时间,最终选出不重叠区间的最大数量。
关键步骤:排序 + 线性扫描
整个过程分两步,简单直接:
- 把所有区间按结束时间升序排序(结束时间相同时,可按开始时间升序,避免边界歧义)
- 遍历排序后的数组,只要当前区间的开始时间 ≥ 上一个已选区间的结束时间,就选它
Java 实现要点
写代码时注意三个细节:
- 定义内部类或记录类封装区间(start/end),并实现Comparator按 end 排序
- 用一个变量记录上一个选中区间的结束时间(初始设为 0 或负数)
- 判断条件必须是 当前 start ≥ 上一个 end,不能用 >,否则 [1,3] 和 [3,5] 这类端点相接的会被错误排除(题目通常允许端点相接)
常见易错点
实际编码中容易踩坑的地方:
立即学习“Java免费学习笔记(深入)”;
- 误按开始时间排序——会导致选到“开头早但占时长”的区间,挤掉多个短任务
- 没处理空数组或单元素情况——加个判空更稳妥
- 排序时只排了 end 数组,却没同步调整 start 数组——务必用对象封装,别用两个分离数组
- 混淆“最多不重叠区间数”和“最大权重和”——后者是加权版本,不能用纯贪心,得用动态规划
一个简洁可运行的示例
比如输入 [[1,3],[2,5],[4,7],[6,9],[8,10]],按 end 排序后是 [[1,3],[2,5],[4,7],[6,9],[8,10]],扫描后选 [1,3]→[4,7]→[8,10],共 3 个。代码返回的就是这个数量,不需要额外存结果列表也能完成计数。


















