1. 程式人生 > >[Leetcode] merge intervals 合並區間

[Leetcode] merge intervals 合並區間

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,const
Interval &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 合並區間