//Leetcode 1024: Stiching Video //You are given a series of video clips from a sporting event that lasted T seconds. These video clips can be overlapping with each other and have varied lengths. // Each video clip clips[i] is an interval: it starts at time clips[i][0] and ends at time clips[i][1]. We can cut these clips into segments freely: for example, a clip[0, 7] can be cut into segments[0, 1] + [1, 3] + [3, 7]. //Return 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. //Example 1: //Input: clips = [[0,2],[4,6],[8,10],[1,9],[1,5],[5,9]], T = 10 //Output: 3 //Explanation: //We take the clips [0,2], [8,10], [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 cover the sporting event [0, 10]. //Example 2: //Input: clips = [[0,1],[1,2]], T = 5 //Output: -1 //Explanation: //We can't cover [0,5] with only [0,1] and [0,2]. public int VideoStitching2(int[][] clips, int T) { if (clips.Length == 0) { return(-1); } IComparer <int[]> myComparer = new ReverseComparer();; Array.Sort(clips, myComparer); int start = clips[0][0], end = clips[0][1], i = 1, count = 1; if (start > 0) { return(-1); } else if (end >= T) { return(1); } while (i < clips.Length && end < T && clips[i][0] <= end) { int max = end; while (i < clips.Length && clips[i][0] <= end) { max = Math.Max(max, clips[i][1]); i++; } end = max; count++; } return(end >= T? count : -1); }
public int VideoStitching(int[][] clips, int T) { if (clips.Length == 0) { return(-1); } IComparer <int[]> myComparer = new ReverseComparer();; Array.Sort(clips, myComparer); int start = clips[0][0], end = clips[0][1]; int max = end, count = 1; int current = 1; if (start > 0) { return(-1); } else if (end >= T) { return(1); } while (current < clips.Length && max < T && clips[current][0] <= end) { while (current < clips.Length && clips[current][0] <= end) // there is still overlap { if (clips[current][1] > max) { max = clips[current][1]; } current++; } count++;// we need another clip end = max; } if (max >= T) { return(count); } else { return(-1); } }