【贪心】把区间按照左端点排序后,假设当前最多能到达ed,那就把左端点在ed之内的所有区间都遍历一遍,找到下次最大能到达的区间,如果下次没有区间能到达就说明到不了了直接返回-1,如果当前能到的最大值>=time直接break就可以;然后继续找下一次能到达的最远ed。
class Solution {
// 58:00 区间合并
public int videoStitching(int[][] clips, int time) {
Arrays.sort(clips, (a, b) -> a[0] - b[0]);
int inf = -1, st = -1, ed = 0, n = clips.length, ans = 0;
for (int i = 0; i < n; i++) {
int j = i;
int mx = ed;
while (j < n && clips[j][0] <= ed) {
mx = Math.max(mx, clips[j][1]);
j++;
}
if (mx == ed && ed < time) return -1;
ed = mx;
i = --j;
ans++;
if (ed >= time) break;
}
if (ed < time) return -1;
return ans;
}
}
【DP】
class Solution {
// 45:00 DP
public int videoStitching(int[][] clips, int time) {
int[] dp = new int[101];
Arrays.sort(clips, (a, b) -> a[0] - b[0]);
for (int i = 1; i <= 100; i++) dp[i] = 101;
for (int i = 0; i < clips.length; i++) {
int st = clips[i][0], ed = clips[i][1];
for (int j = st; j <= ed; j++) dp[j] = Math.min(dp[j], dp[st] + 1);
}
return dp[time] >= 101? -1: dp[time];
}
}