【传送门】https://leetcode.com/problems/video-stitching/
【原题描述】
1024. Video Stitching
Medium
19
6
Favorite
Share
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].
Example 3:
Input: clips = [[0,1],[6,8],[0,2],[5,6],[0,4],[0,3],[6,7],[1,3],[4,7],[1,4],[2,5],[2,6],[3,4],[4,5],[5,7],[6,9]], T = 9
Output: 3
Explanation:
We can take clips [0,4], [4,7], and [6,9].
Example 4:
Input: clips = [[0,4],[2,8]], T = 5
Output: 2
Explanation:
Notice you can have extra video after the event ends.
Note:
1 <= clips.length <= 100
0 <= clips[i][0], clips[i][1] <= 100
0 <= T <= 100
Accepted
1,645
Submissions
3,754
Hide Hint 1
What if we sort the intervals? Considering the sorted intervals, how can we solve the problem with dynamic programming?
Hide Hint 2
Let's consider a DP(pos, limit) where pos represents the position of the current interval we are gonna take the decision and limit is the current covered area from [0 - limit]. This DP returns the minimum number of taken intervals or infinite if it's not possible to cover the [0 - T] section.
【Related topics】DP
【题目大意及题解】
给出若干个区间以及一个数字T,求所给区间中能够组成区间[0, T]所需的最少区间数。本题使用dp,先对区间从小到大排序,我想到的一个状态转移方程为:f[end] = min(f[start] + 1, f[end]) ,f[0] = 0,其中start、end分别对应当前处理区间的起止点。需要注意的是,每次更新 f[end] 后需要对区间 [1, end - 1] 的所有点进行更新。
【代码】
Runtime: 4 ms, faster than 100.00% of C++ online submissions for Video Stitching.
Memory Usage: 9.2 MB, less than 100.00% of C++ online submissions for Video Stitching.
static int _ = [](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
static bool cmp(vector& a, vector& b)
{
if(a[0] == b[0])
return a[1] < b[1];
return a[0] < b[0];
}
static const int MAX = 1000000;
int videoStitching(vector>& clips, int T) {
sort(clips.begin(), clips.end(), cmp);
int count[101];
count[0] = 0;
for(int i = 1; i < 101; ++i)
count[i] = MAX;
int size = clips.size();
for(int i = 0; i < size; ++i)
{
count[clips[i][1]] = min(count[clips[i][0]] + 1, count[clips[i][1]]);
/* 这一步更新该区间终点前的所有点 */
for(int j = 1; j < clips[i][1]; ++j)
count[j] = min(count[clips[i][1]], count[j]);
}
return count[T] == MAX ? -1 : count[T];
}
};