1. 题目来源
链接:1024. 视频拼接
2. 题目说明
3. 题目解析
方法一:贪心+区间覆盖
凡是遇到区间问题的,大多都是贪心。
这道节日题目就是典型的 区间覆盖问题,就是给你 N
个区间,然后给你两个左右端点,输出能覆盖这个端点区间且最少的区间数目。算是区间问题的模板题,可以查看我的 区间问题专栏,里面是一些常见的区间问题算法模板题,应该是跟着时间更新越来越难hh,可以倒序来看。
贪心思路:
- 左端点排序,注意
sort
排序二维数组是将二维数组分成一个个一维数组进行排序的,其排序方式和一维一样 - 双指针维护选择的区间,注意为了维护右端点位置,通过双指针数组下标索引到右端点位置
- 顺序依次枚举各个区间,在所能覆盖指定区间的区间中,找到右端点最靠右的区间, 然后将
st
更新为右端点的值即可 - 判断区间不能被覆盖的条件这给踩坑了,代码里做了详细分析
参见代码如下:
class Solution {
public:
int videoStitching(vector<vector<int>>& clips, int T) {
sort(clips.begin(), clips.end());
int res = 0, n = clips.size(), st = 0;
for (int i = 0; i < n; ++i) { // 枚举各个待选区间
int j = i, r = -1;
while (j < n && clips[j][0] <= st) { // 选择一个在维护区间内的右端点最远值,等于区间的一个合并
r = max(r, clips[j][1]);
++j;
}
// 如果维护的区间的右端点都没到达,就是当前枚举的区间和现在维护的区间中间有空白,无法继续合并了
// 则当前维护的区间的r都小于当前枚举的l,则不可能对[0,T]区间进行覆盖了
// 说白了就是上层的while循环没进去,clips[j][0]表示新枚举的区间左端点,
// 可参考样例
// [[0,2],[4,8]]
// 5
if (r < st) return -1;
res ++;
if (r >= T) return res;
i = j - 1; // i在for循环自动加1,j需要回退一位
st = r;
}
return -1;
}
};