1. 程式人生 > 其它 >Leetcode 1024. 視訊拼接(中等) 貪心演算法

Leetcode 1024. 視訊拼接(中等) 貪心演算法

labuladong講解

1024. 視訊拼接(中等)

題目:

思路:

給定一個目標區間和若干小區間,如何通過裁剪和組合小區間拼湊出目標區間?最少需要幾個小區間?

這道題的以下兩個特點:

1、要用若干短視訊湊出完成視訊[0, T],至少得有一個短視訊的起點是 0。

這個很好理解,如果沒有一個短視訊是從 0 開始的,那麼區間[0, T]肯定是湊不出來的。

2、如果有幾個短視訊的起點都相同,那麼一定應該選擇那個最長(終點最大)的視訊。

基於以上兩個特點,將clips按照起點升序排序,起點相同的按照終點降序排序

我們會比較所有起點小於clips[0][1]的區間,根據貪心策略,它們中終點最大的那個區間就是第二個會被選中的視訊

然後可以通過第二個視訊區間貪心選擇出第三個視訊,以此類推,直到覆蓋區間[0, T],或者無法覆蓋返回 -1。

class Solution {
public:
    int videoStitching(vector<vector<int>>& clips, int time) {
        // 按起點升序排列,起點相同的降序排列
        sort(clips.begin(),clips.end(),[](vector<int>& a,vector<int>& b){
            if(a[0
]==b[0]) return a[1]>b[1]; return a[0]<b[0]; }); int n=clips.size(); int i=0; int curEnd=0,nextEnd=0; // 記錄選擇的短視訊個數 int count=0; while(i<n&&clips[i][0]<=curEnd){ // 在第 res 個視訊的區間內貪心選擇下一個視訊 // 選取起點在上一個選取視訊終點前的區間中end最大的
while(i<n&&clips[i][0]<=curEnd){ nextEnd=max(nextEnd,clips[i][1]); i++; } // 找到下一個視訊,更新 curEnd count++; curEnd=nextEnd; if(curEnd>=time){ // 已經可以拼出區間 [0, T] return count; } } // 無法連續拼出區間 [0, T] return -1; } };
聯絡方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=