1. 程式人生 > >LeetCode 之 Merge Intervals — C++ 實現

LeetCode 之 Merge Intervals — C++ 實現

Merge Intervals

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].

給定一個區間集合,合併所有重複區間。

例如,

給定 [1,3],[2,6],[8,10],[15,18]

返回 [1,6],[8,10],[15,18]

分析:

    先將各區間按照左邊界(若左邊界相等,按右邊界)排序,然後再合併。當一個區間的右邊界大於另一個區間的左邊界時,不需要合併,否則區間有重合,這時只需要用大的右邊界作為該區間的右邊界,重複此過程。

注意:不要忘記最後一個合併區間。

class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
        int intervalsSize = intervals.size();
        if(intervalsSize == 0 || intervalsSize == 1)
        {
            return intervals;
        }
        
        //對 interval 按 start 的升序排序
        sort(intervals.begin(), intervals.end(), intervalComp);
        
        vector<Interval> retv;
        Interval inter(intervals[0].start, intervals[0].end);
        
        for(int index = 1; index < intervalsSize;)
        {
            if(inter.end < intervals[index].start) //無區間重合,直接把前一個區間放入已合併和的 vector 中
            {
                retv.push_back(inter);
                inter.start = intervals[index].start;
                inter.end = intervals[index].end;
            }
            else if(inter.end < intervals[index].end) //區間有重合,直接用大邊界代替
            {
                inter.end = intervals[index].end;
            }
            
            if(index + 1 == intervalsSize) //原陣列中無區間待合併,將臨時區間加入合併好區間
            {
                retv.push_back(inter);
            }
            ++index;
        }
        
        return retv;
    }
    
    static bool intervalComp(Interval& val1, Interval& val2)
    {
        if(val1.start == val2.start) //start相等,則按 end 升序排列
        {
            return (val1.end < val2.end);
        }
        
        return (val1.start < val2.start);
    }
};