題目描述
給出一個區間的集合,請合並所有重疊的區間。
示例 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 };