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]
.
10/7/2015 update
Runtime error, quite strange.
I don’t figure out why yet.
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ struct { bool operator()(const pair<int, bool> a, const pair<int, bool> b){ if(a.first < b.first){ return true; } else if(a.first > b.first){ return false; } else{ if(a.second == true){ return true; } else{ return false; } } } } cmp; class Solution { public: vector<Interval> merge(vector<Interval>& intervals) { vector<Interval> ans; vector<pair<int, bool> > points; //x, true means start point, false means end point for(auto interval : intervals){ points.push_back(make_pair(interval.start, true)); points.push_back(make_pair(interval.end, false)); } sort(points.begin(), points.end(), cmp); int count = 0; int start = -1; for(auto it = points.begin(); it != points.end(); it++){ auto point = *it; if(point.second == true){ //left point if(start == -1){ start = point.first; } count++; } else{ //right point count--; if(count == 0){ //end of a line segment if(point.first > start){ ans.push_back(Interval(start, point.first)); } start = -1; } } } return ans; } };
很有趣的题目。思路是,把给定的intervals数组按照start排序。然后遍历一下排序后的数组,比较当前元素的start是否落在了起始的(start, end)内,如果落在范围内的话,再把当前元素的end和起始的end作比较,如果当前元素end更大的话,则起始end=当前的end。达到扩展范围的目的。
需要注意,在for循环结束或,我们需要把最后一组start,end压入re中。
时间花在了排序上所以是o(nlogn)
/** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0), end(0) {} * Interval(int s, int e) : start(s), end(e) {} * }; */ struct{ bool operator()(Interval a, Interval b){ return a.start < b.start; } }cmp; class Solution { public: vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> re; if(intervals.empty()) return re; sort(intervals.begin(),intervals.end(), cmp); int start = intervals[0].start; int end = intervals[0].end; for(vector<Interval>::iterator it = intervals.begin(); it != intervals.end(); it++){ //overlap, extend 'end' if((*it).start <= end){ end = (*it).end > end? (*it).end: end; } //not overlap else{ Interval tmp = Interval(start, end); re.push_back(tmp); start = (*it).start; end = (*it).end; } } Interval tmp = Interval(start, end); re.push_back(tmp); return re; } };