區間合併002

answer_yym發表於2020-09-25

1、描述

56給出一個區間的集合,請合併所有重疊的區間。

示例 1:

輸入: intervals = [[1,3],[2,6],[8,10],[15,18]]
輸出: [[1,6],[8,10],[15,18]]
解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合併為 [1,6].
示例 2:

輸入: intervals = [[1,4],[4,5]]
輸出: [[1,5]]
解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/merge-intervals
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

2、關鍵字

多個區間,

3、思路

使用兩層vector,存起來
還沒思路
怎麼根據元組的第一個值來排序?可以直接呼叫sort函式!!!!!

4、notes

遍歷整個排序好的

提交了才知道是做過的題了,我服了!!!
||後面的換站的角度了,就把res放到左邊,然後遍歷每個線段的時候,和res的最後一個元素的右端點作比較,

  if(res.empty()|| res.back()[1]<L)

5、複雜度

時間: O(nlogn)
空間:O(logN)

6、code

 bool cmp(const vector<int> & a, const vector<int> & b) {
        if (a[0] == b[0]) {
            return a[1] < b[1];
        }
        return a[0] < b[0];
    }

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;   // 定義答案
        if(!intervals.size()) return res;  // 如果為空,直接返回
        sort(intervals.begin(),intervals.end(),cmp);  // 可以直接比較

        for(auto tem:intervals)  // 遍歷整個列表,處理完所有線段就好了。
        {
            int L=tem[0],R=tem[1];  // 把當前線段的邊界存起來
            if(res.empty()|| res.back()[1]<L)  // 如果結果集是空的,就直接加進來,不然就看第二個條件成立否,   這裡||後面就轉換位置了!!!
            {                                 //結果集的最後一個元素,的後邊界如果小於當前的左邊界,就直接加入結果集         
                res.push_back(tem);
            }
            else  // 不然就是重疊了,把結果集的最後一個元素的右邊界更新,要麼吞掉,要麼擴大
            {
                res.back()[1]=max(res.back()[1],R);  // 吞掉,擴大
            }
        }
        return res;

    }
};

相關文章