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].
合并有重叠的区间,且原区间序列无序
/** * 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 compare(const Interval &first,const Interval &second) { if(first.start==second.start) return first.end<second.end; else return first.start<second.start; } vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> ret; int n=intervals.size(); int pre=0, cur=0; sort(intervals.begin(),intervals.end(),compare); while(cur<n) { while(cur<n&&intervals[pre].end>=intervals[cur].start) { intervals[pre].start=min(intervals[pre].start,intervals[cur].start); intervals[pre].end=max(intervals[pre].end,intervals[cur].end); cur++; } ret.push_back(intervals[pre]); pre=cur; } return ret; } };
思路:先按照[0]来排序,然后将intervals[0]塞入res,遍历intervals,如果res.back()[1]>=intervals[i][0],则res.back()[1]=max(res.back()[1],intervals[i][1]),因为可能会有[1,4],[2,3]合并。
class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<vector<int>> res; if(intervals.size()<1) return res; sort(intervals.begin(), intervals.end()); res.push_back(intervals[0]); for(int i=1;i<intervals.size();++i) { if(res.back()[1]>=intervals[i][0]) res.back()[1]=max(res.back()[1], intervals[i][1]); else res.push_back(intervals[i]); } return res; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=