[Leetcode] merge intervals 合並區間
阿新 • • 發佈:2017-07-01
public 代碼 個人 cti truct int 如何 lec http
Given a collection of intervals, merge all overlapping intervals.
For example,
Given[1,3],[2,6],[8,10],[15,18],
return[1,6],[8,10],[15,18].
題意:給定一系列區間,合並重疊區間
思路:其實,個人覺得,題目的例子有一定誤導性,以為區間已經按每個區間的start值排好序了。結果,毫無疑問,悲劇了。若是已經排好序,則,只需將當前區間的end值和下一個的start值比較,若是,before.end>=next.start,說明兩個區間有重合,只需將後者的end值賦給前者的end值就行; before.end<next.start說明沒有重疊,這樣,就將前者存入結果,然後訪問下一個就行。那麽關鍵點來了,如何給這些區間排序?我們可以使用向算法傳遞函數,使用sort的第二版本,它接受第三個參數(為一個謂詞),關於泛型算法,我將後續中給出較為詳細的講解。代碼如下:
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 static bool compare(const Interval &a,constInterval &b) 13 { 14 return a.start<b.start; 15 } 16 17 vector<Interval> merge(vector<Interval> &intervals) 18 { 19 20 vector<Interval> res; 21 int len=intervals.size(); 22 if(len==0) return res; 23 sort(intervals.begin(),intervals.end(),compare);24 res.push_back(intervals[0]); 25 26 for(int i=1;i<len;++i) 27 { 28 int rLen=res.size(); 29 if(res[rLen-1].end>=intervals[i].start) 30 { 31 res[rLen-1].end=max(res[rLen-1].end,intervals[i].end); 32 } 33 else 34 res.push_back(intervals[i]); 35 } 36 return res; 37 } 38 };
在上述代碼中,第28行,因為我們要實時訪問res的最後一個區間的end值,但res是在變化的,所以通過這種方式訪問,當然也可以通過使用back函數來訪問以下方式:
1 for(int i=1;i<intervals.size();++i) 2 { 3 if(res.back().end>=intervals[i].start) 4 { 5 res.back().end=max(res.back().end,intervals[i].end); 6 } 7 else 8 { 9 res.push_back(intervals[i]); 10 } 11 }
[Leetcode] merge intervals 合並區間