LeetCode56. 合併區間(思維+貪心)

題目鏈接Leetcode56
在這裏插入圖片描述
思路:貪心,先按左端點排序並且在左端點相同的情況下右端點靠近左邊的排前面,然後用雙指針訪問所有區間,當左端點大於前面的右端點說明兩個區間互斥了,要把之前的並區間推入答案集中,由於是按左端點爲第一關鍵字的排序,所以後面的只要更新右端點就夠了。最後可能會沒有更新,所以人爲地加一個最大地區間保證這個區間之前地全部更新。這題實際上是讓你求區間的並集,如果求交集呢?見Leetcode986

class Solution {
    #define pii pair<int,int>
    #define mp(a,b) make_pair(a,b)
    #define SZ(V) (int)(V.size())
    #define fi first
    #define se second
public:
    static bool compare(pii a, pii b) {
        if(a.fi!=b.fi) return a.fi<b.fi;
        return a.se<b.se;
    }
    
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        
        vector<vector<int> > ans;
        ans.clear();
        if(SZ(intervals) == 0) return ans;
        vector<pii > qu;
        qu.clear();
        for(int i=0; i<SZ(intervals); i++)           
            qu.push_back(pii(intervals[i][0],intervals[i][1]));
        sort(qu.begin(),qu.end(), compare); //按右端點排序
        qu.push_back({INT_MAX,INT_MAX}); //保證最後一個區間會被更新
        int l, r; //之前最大的區間塊
        l=qu[0].fi; r=qu[0].se;
        for(int i=1; i<SZ(qu); i++) {
            if(qu[i].fi>r) //發現新的區間塊,之前的壓入結果集 l,r更新爲當前的
                ans.push_back({l,r}), l=qu[i].fi, r=qu[i].se;
            else if (qu[i].se>r) //否則看一下右端點是否能夠延長 
                r=qu[i].se;
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章