1. 程式人生 > >leetcode---- 56. 合併區間

leetcode---- 56. 合併區間

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

示例 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] 可被視為重疊區間。

需要注意的問題:

1. 邊界問題,特別是給定資料為空,或者只有一個的情況

2 自定義比較函式,注意這裡加上static關鍵字

  或者在函式中這樣寫

 sort(intervals.begin(), intervals.end(), [](Interval &a, Interval &b) {return a.start < b.start;});

3 我本來可以獨立完成的,不自信。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:
    
     static bool cmp(const Interval &a, const Interval &b)
       {
       return a.start < b.start;
       }
    vector<Interval> merge(vector<Interval>& intervals) {
           

       sort(intervals.begin(),intervals.end(),cmp);
       vector<Interval> res;
       if(intervals.size()==0) return res; 
       if(intervals.size()==1) {res.push_back(intervals[0]); return res; } 
       int a[intervals.size()] ={0};
       Interval it1,it2;
       for(int i=0;i<intervals.size()-1;i++)
       {
        	it1=intervals[i];
            it2=intervals[i+1];
        	if(it1.end>=it2.start) 
            {
              a[i]=0;
              a[i+1]=1;
              intervals[i+1].start=it1.start;
              intervals[i+1].end=max(it1.end,it2.end);  
            }
            else
            {
              a[i]=1;
              a[i+1]=1;  
            };
       } 
       for(int i=0;i<intervals.size();i++)
       {
           if(a[i]) res.push_back(intervals[i]);
       }
       return res; 
        
    }
};