题目链接
解题思路
-
对于所有左端点相同的子区间,其右端点越远越有利。且最佳方案中不可能出现两个左端点相同的子区间。于是预处理所有的子区间,对于每一个位置
i
,记录以其为左端点的子区间中最远的右端点,计为maxn[i]
-
枚举每一个位置,假设当枚举到位置
i
时,记左端点不大于i
的所有子区间的最右远端点为last
,这样last
就代表了当前能覆盖到的最远的右端点。 -
每次枚举到一个新位置,都用
maxn[i]
来更新last
。如果更新后的last == i
,那么说明下一个位置无法被覆盖,完成目标 -
同时还需要记录上一个被使用的子区间的结束位置为
pre
,每次越过一个被使用的子区间,就说明需要启用一个新子区间,这个新子区间的结束位置即为当前的last
。也就是说,每当遇到i == pre
,则说明用完了一个被使用的子区间。这种情况下ans++
,并更新pre
即可
AC代码
class Solution {
public int videoStitching(int[][] clips, int T) {
int[] maxn = new int[T];
int last = 0, ret = 0, pre = 0;
for (int[] clip : clips) {
if (clip[0] < T) {
maxn[clip[0]] = Math.max(maxn[clip[0]], clip[1]);
}
}
for (int i = 0; i < T; i++) {
last = Math.max(last, maxn[i]);
if (i == last) {
return -1;
}
if (i == pre) {
ret++;
pre = last;
}
}
return ret;
}
}