leetcode打卡:合併區間

合併區間

1.題目描敘

給出一個區間的集合,請合併全部重疊的區間。c++

示例 1:code

輸入:[[1,3],[2,6],[8,10],[15,18]]
輸出:[[1,6],[8,10],[15,18]]
解釋:區間[1,3]和[2,6]重疊,將他們合併爲[1,6].

示例2:排序

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

2.思路

看到示例1時,咱們會發現經過比較當前位置的第二個元素和下一個位置的第一個元素的大小,前者大於等於後者,就能夠將兩區間合併成一個新區間,而後用着新區間的第二個元素繼續比較便可,前者小於後者,咱們就能夠把當前區間拿走了,跳到下一個區間重複上述步驟便可,若是你覺得就這樣完了,那這就只能是個簡單題了。class

咱們觀察後會發現示例1是有序的,第一個元素和第二個元素都是不遞減的,可若是打亂一下,就不能按咱們上述思路去解了,因此首先咱們第一步就是給區間排序,而後纔是上面的方法。方法

給定區間集合nums
設置[left,right]存儲合併後區間
1.對nums進行排序,left,right取第一個區間的左右邊界;
2.比較right和nums[i][0]的大小
    1.right>=nums[i][0]:right=right>nums[i][1]?right:nums[i][1]//若是當前區間的右邊界大於right,更新right
    2.right<nums[i][0]:即兩區間沒有重疊,存儲[left,right]後,更新left,right爲當前區間的值,重複上述步驟.

3.代碼實現

vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size()==0)
        return {};
        sort(intervals.begin(),intervals.end());
        vector<vector<int>>ans;
        int left=intervals[0][0];//用來存儲合併區間的左右邊界
        int right=intervals[0][1];
        for(int i=1;i<intervals.size();i++){
            if(intervals[i][0]<=right){
                right=intervals[i][1]>right?intervals[i][1]:right;
            }
            else{
                ans.push_back({left,right});
                left=intervals[i][0];
                right=intervals[i][1];
            }
        }
        ans.push_back({left,right});
        return ans;
    }
相關文章
相關標籤/搜索