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