- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Video Stitching in C++
Suppose we have a series of video clips from a sporting event that lasted T seconds. Now these video clips can be overlapping with each other and have varied lengths. Here each video clip clips[i] is an interval − it starts at clips[i][0] time and ends at clips[i][1] time. We can cut these clips into segments freely − We have to find the minimum number of clips needed so that we can cut the clips into segments that cover the entire sporting event ([0, T]). If the task is impossible, return -1. So if the input is like [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], and T = 10, then the output will be 3, as we can take clips [0,2], [8,10] and [1,9], a total of 3 clips, then we can reconstruct the sporting event as follows, we cut [1,9] into segments [1,2] + [2,8] + [8,9]. Now we have segments [0,2] + [2,8] + [8,10] which are covering the sporting event [0, 10].
To solve this, we will follow these steps −
Create an array v of size T + 1, and fill this with – 1
n := size of clips
for i in range 0 to n – 1
if clips[i, 0] > T, then skip to the next iteration
v[clips[i, 0]] := max of v[clips[i, 0]] and min of (clips[i, 1] and T)
curr := v[0]
if v[0] is -1, then return -1
i := 1, ret := 1 and next := 0
while curr < T and i <= n
while i <= curr
next := max of next and v[i]
increase i by 1
if next = curr and next is -1, then return -1
curr := next
return ret when curr >= T, otherwise return – 1
Let us see the following implementation to get better understanding
Example
#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)); }
Input
[[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]] 10
Output
3