【leetcode题解】leetcode 1024 Video Stitching

【传送门】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];
    }
};

 

你可能感兴趣的:(【leetcode题解】leetcode 1024 Video Stitching)