57 | Insert Interval |
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ bool overlap(const Interval &left,const Interval &right){ return !(left.end<right.start||right.end<left.start); } struct Overlap:public std::binary_function<Interval,Interval,bool>{ bool operator()(const Interval &left,const Interval&right)const{ return !(left.end<right.start||right.end<left.start); } }; struct IntervalCompare:public std::binary_function<Interval,Interval,bool>{ bool operator()(const Interval &left,const Interval&right)const{ return left.start<right.start; } }; class Solution { public: vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) { vector<Interval> ans; ans.reserve(intervals.size()); if(intervals.empty()){ ans.push_back(newInterval); return ans; } // std::sort(intervals.begin,intervals.end(),IntervalCompare()); int i=0; Interval merge = intervals[0]; vector<Interval> &merges=intervals; merge = newInterval; if(newInterval.end<merges[0].start) { } else { for(i=0;i<merges.size();i++) { if(Overlap()(merge,merges[i])) { merge.start = std::min(merge.start,merges[i].start); merge.end = std::max(merge.end,merges[i].end); } else { if(merge.end<merges[i].start){ break; } ans.push_back(merges[i]); } } } ans.push_back(merge); ans.insert(ans.end(),merges.begin()+i,merges.end()); return ans; } };
这个其实,像扫描线(sweep)算法(在二维计算几何中,经常用到)
基本思路:注意到已经按照每个Interval的start排序了
<1>将需要检查的newInterval,依次和每个interval合并(循环)
<2>如果发现没有重叠,跳出
<3>添加合并后的merge 区间,添加哪些不与newInterval重叠的区间。
上述,很容易理解,但有个问题:
为什么保证结果一定有序?即按照区间的start排序?
其实,这是因为,<1>中基本上属于插入排序过程,所以结果一定有序。