C ++中的视频拼接
假设我们有一个来自体育赛事的视频片段,持续了T秒。现在,这些视频剪辑可以彼此重叠并且具有不同的长度。这里,每个视频片段clips[i]是一个间隔−它始于clips[i][0]时间,结束于clips[i][1]时间。我们可以自由地将这些片段剪切成片段-我们必须找到所需片段的最少数量,以便我们可以将片段剪切成覆盖整个体育赛事([0,T])的片段。如果无法完成任务,则返回-1。因此,如果输入类似于[[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]],并且T=10,则输出为3,因为我们可以截取片段[0,2],[8,10]和[1,9],总共3个片段,那么我们可以按如下方式重构体育赛事,我们将[1,9]划分为[1,2]+[2,8]+[8,9]段。现在我们有了细分[0,2]+[2,8]+[8,10],它们涵盖了体育赛事[0,
为了解决这个问题,我们将遵循以下步骤-
创建大小为T+1的数组v,并用–1填充它
n:=片段大小
对于i,范围为0至n–1
如果clips[i,0]>T,则跳至下一个迭代
v[clips[i,0]]:=v[clips[i,0]]的最大值和(clips[i,1]和T)的最小值
curr:=v[0]
如果v[0]为-1,则返回-1
i:=1,ret:=1和next:=0
而curr<T和i<=n
下一个:=下一个和v[i]的最大值
使我增加1
而我<=curr
如果next=curr并且next为-1,则返回-1
curr:=下一个
当curr>=T时返回ret,否则返回–1
让我们看一下下面的实现以获得更好的理解
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int videoStitching(vector<vector<int>>& clips, int T) {
vector <int> v(T + 1, -1);
int n = clips.size();
for(int i = 0; i < n; i++){
if(clips[i][0] > T)continue;
v[clips[i][0]] = max(v[clips[i][0]], min(clips[i][1],
T));
}
int curr = v[0];
if(v[0] == -1)return -1;
int i = 1;
int ret = 1;
int next = 0;
while(curr < T && i <= n){
while(i <= curr){
next = max(next, v[i]);
i++;
}
if(next == curr || next == -1) return -1;
curr = next;
ret++;
}
return curr >= T? ret : -1;
}
};
main(){
vector<vector<int>> v1 = {{0,2},{4,6},{8,10},{1,9},{1,5},{5,9}};
Solution ob;
cout << (ob.videoStitching(v1, 10));
}输入值
[[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]] 10
输出结果
3
热门推荐
10 对患者生日祝福语简短
11 结婚祝福语简短装备
12 周岁祝福语学生文案简短
13 订婚领证祝福语简短精辟
14 导师获奖祝福语大全简短
15 新婚购房祝福语简短精辟
16 牛年祝福语简短的爱人
17 送芒果的祝福语简短
18 送给学长毕业祝福语简短