题目
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、按区间头递增排序;
2、从头开始向后扫描:将临时区间设为第0个区间
2.1、后一个区间的头小于临时区间的尾,将两者合并;
2.2、后一个区间的头大于临时区间的尾,将临时区间插入输出结果,将后一个区间作为新的临时区间;
代码:
/** * 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 cm(const Interval &i1,const Interval &i2); //按头位置递增排序 class Solution { public: vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> ans; sort(intervals.begin(),intervals.end(),cm); //排序 int len=intervals.size(); if(len==0) return ans; Interval itemp; //临时数据,用于合并操作 itemp.start=intervals[0].start; itemp.end=intervals[0].end; for(int i=1;i<len;i++) //扫描,合并 { if(intervals[i].start<=itemp.end) //后面的头小于前面的尾,合并 itemp.end=max(intervals[i].end,itemp.end); else //不能再合并,压入,取新的区间 { ans.push_back(itemp); itemp.start=intervals[i].start; itemp.end=intervals[i].end; } } ans.push_back(itemp); //处理最后一个 return ans; } }; bool cm(const Interval &i1,const Interval &i2) { return i1.start<i2.start; }