LeetCode 56. 合並區間(Merge Intervals)


 

題目描述

 

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

示例 1:

輸入: [[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] 可被視為重疊區間。

 

解題思路

 

從例子可以看出,兩個區間若能合並,則第一個區間的右端點一定不小於第二個區間的左端點。所以先把區間集合按照左端點從小到大進行排序,接着從第一個區間開始遍歷,對每個區間執行如下操作:

  • 首先保存該區間的左端點start和右端點end
  • 從該區間的下一個區間開始,依次比較此區間的左端點與上一個區間的右端點,若滿足合並條件則記錄新合並區間的右端點。注意右端點取當前區間與之前區間右端點的較大值
  • 若當前區間不再滿足合並條件或者遍歷到了集合末尾,就構建新合並區間,其中左端點為初始區間的左端點,右端點為當前所有合並區間右端點的最大值,然后將其加入到結果集合中,接着合並下一個區間

 

代碼

 

 1 /**
 2  * Definition for an interval.
 3  * struct Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() : start(0), end(0) {}
 7  *     Interval(int s, int e) : start(s), end(e) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<Interval> merge(vector<Interval>& intervals) {
13         sort(intervals.begin(), intervals.end(), cmp);
14         if(intervals.size() == 1)
15             return intervals;
16         vector<Interval> res;
17         int i = 0;
18         while(i < intervals.size()){
19             int start = intervals[i].start, end = intervals[i].end;
20             int j = i+1;
21             while(j < intervals.size() && intervals[j].start <= end){
22                 if(end < intervals[j].end)
23                     end = intervals[j].end;
24                 j++;
25             }
26             struct Interval merge = {start, end};
27             res.push_back(merge);
28             i = j;
29         }
30         return res;
31     }
32     static bool cmp(Interval a, Interval b){
33         return a.start < b.start;
34     }
35 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM