区间调度问题是贪心算法的经典应用场景:在有限资源下选择最多的不重叠区间。从简单的活动选择到复杂的会议室分配,核心都是"排序 + 贪心选择"。
一、经典问题:最多不重叠区间
Mermaid · 渲染中(下方为源码)
graph LR A[区间集合] --> B[按结束时间排序] B --> C[贪心选最早结束] C --> D[跳过冲突]
给定 n 个区间 [start, end],选出最多的互不重叠区间。
贪心策略:按结束时间排序
// LeetCode 435: 无重叠区间(求最少移除数)
int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[1] - b[1]); // 按结束时间
int count = 0;
int end = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < end) {
count++; // 重叠,移除
} else {
end = intervals[i][1]; // 不重叠,保留
}
}
return count;
}为什么按结束时间?
结束越早 → 留给后续区间的空间越大 → 能选更多。
二、会议室问题(LeetCode 253)
求同时进行的最大会议数 = 最少需要的会议室数。
方法一:排序 + 最小堆
int minMeetingRooms(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[0] - b[0]); // 按开始时间
PriorityQueue<Integer> pq = new PriorityQueue<>(); // 结束时间
for (int[] interval : intervals) {
if (!pq.isEmpty() && pq.peek() <= interval[0]) {
pq.poll(); // 复用会议室
}
pq.offer(interval[1]);
}
return pq.size();
}