1.题目
视频拼接 - 力扣(LeetCode) https://leetcode-cn.com/problems/video-stitching/
2.题解
首先,先准备一个dp数组,给后面存放状态使用。之后给clips数组进行排序,return o1-o2;代表交换位置。然后遍历这个视频碎片数组,排除不符合要求的情况。对于目标碎片,则分为两类,分别是以0开始的碎片段和其他碎片段两类。分别计算出对于dp数组中储存的值。
如果拼接成功,dp[T]的值就是目标结果,不成功则输出-1。
3.代码
//视频拼接的逻辑
class Solution {
public int videoStitching(int[][] clips, int T) {
// 状态量,用于记录到达对应时间点所需的最少碎片数
int[] dp = new int[T + 1];
// 根据视频碎片的起点来排序
Arrays.sort(clips, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
// 遍历所有视频碎片
for (int[] k : clips) {
// 当视频碎片不在我们要的时间范围内时,直接跳过
if (k[0] >= dp.length){
continue;
}
// 视频碎片没有办法连续,直接跳出返回 -1
if (k[0] != 0 && dp[k[0]] == 0){
return -1;
}
// 当视频碎片的末端超过我们要求的时间,进行裁剪
if (k[1] >= dp.length){
k[1] = dp.length - 1;
}
// 将视频碎片分为两类
if (k[0] == 0) {
// 从 0开始的,直接范围内的时间都置为 1个碎片可达
for (int i = k[0]; i <= k[1]; i++) {
dp[i] = 1;
}
} else {
// 其他碎片段,判断新的碎片能否带来更少的所需碎片
int temp = dp[k[0]] + 1;
for (int i = k[0]; i <= k[1]; i++) {
if (dp[i] == 0 || dp[i] > temp) {
dp[i] = temp;
}
}
}
}
// dp[T]为 0意味着未能到达 T点,因此未能拼接成功
return dp[T] == 0? -1: dp[T];
}
}
网友评论