LeetCode 之 Merge Intervals — C++ 實現
阿新 • • 發佈:2019-02-10
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); } };