区间覆盖

进阶

区间覆盖贪心地每次选能延伸最远的区间。

区间覆盖

输入偶数个整数:区间起点、终点交替。目标覆盖 [0, 10]。

AlgoAnim · 区间覆盖

待机

速度
待机
// 源代码
1int intervalCover(int L, int R, vector<pair<int,int>>& segs) {
2    sort(segs.begin(), segs.end());
3    int cur = L, cnt = 0, i = 0, n = segs.size();
4    while (cur < R && i < n) {
5        int farthest = cur;
6        while (i < n && segs[i].first <= cur) {
7            farthest = max(farthest, segs[i].second);
8            i++;
9        }
10        if (farthest == cur) return -1;
11        cur = farthest;
12        cnt++;
13    }
14    return cur >= R ? cnt : -1;
15}

复杂度分析

时间 O(n log n)
空间 O(n)
最优 O(n) 已排序时
最坏 O(n log n)

算法讲解

区间覆盖问题给定一个目标区间 [L, R] 和若干候选区间,要求用最少的候选区间覆盖目标。

贪心策略:从左端 L 出发,每次选择左端不超过当前覆盖右界、且右端延伸最远的区间。

如果某一轮找不到能继续延伸的区间,则覆盖不可能完成。

正确性源于"多覆盖不亏":在满足左端约束的条件下,右端越远,给后续步骤留下的余地越大。