【力扣】無重疊區間 -給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。

435. 無重疊區間

給定一個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。
注意:
可以認爲區間的終點總是大於它的起點。
區間 [1,2] 和 [2,3] 的邊界相互“接觸”,但沒有相互重疊。

示例 1:
輸入: [ [1,2], [2,3], [3,4], [1,3] ]
輸出: 1
解釋: 移除 [1,3] 後,剩下的區間沒有重疊。

示例 2:
輸入: [ [1,2], [1,2], [1,2] ]
輸出: 2
解釋: 你需要移除兩個 [1,2] 來使剩下的區間沒有重疊。

示例 3:
輸入: [ [1,2], [2,3] ]
輸出: 0
解釋: 你不需要移除任何區間,因爲它們已經是無重疊的了。

代碼

最初想複雜了想用掃線法發現不能用。唉。

class Solution {
public:
    static bool mycmp(vector<int>& a, vector<int>& b) {
        return a[1] < b[1];//對每行的右值進行對比
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if (intervals.empty())return 0;
        int res = 0;
        //對右值排序才能使需要移除區間數最小。
        sort(intervals.begin(), intervals.end(),mycmp);
        int right = intervals[0][1];
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] < right)//說明有重疊部分刪除
                res++;
            else
                right = intervals[i][1];//說明沒重疊部分更新右值
        }
        return res;
    }
};
int main() {
    //[ [1,2], [2,3], [3,4], [1,3] ]
    vector<vector<int>>vec = { {1,2},{2, 3},{3,4}, {1,3} };
    Solution S;
    cout << S.eraseOverlapIntervals(vec) << endl;// 結果爲1
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章