LeetCode OJ 56. Merge Intervals
Description
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]
.
解题思路
这道题的题意是将重叠的区间合并起来。
首先需要将Intervals集合进行排序,按照第一个元素的升序进行排序。初始化结果集合只有第一个区间,将结果结合的最后一个元素和排序后的集合的当前下标的区间进行比较。eg. ,[a, b]
和[c, d]
当b <= c < d
时,需要将这两个区间合并为[a, d]
并存入结果中作为当前结果结合的最后一个元素。否则将[c, d]
存入结果集合中。如此循环直到集合访问完毕,最后的结果也就得到了。
note:
std::sort函数是全局的,如果第三个参数cmp不是静态成员函数或者全局函数,运行都会报错。非静态函数是依赖于具体对象的,因此调用sort函数时,只能调用不依赖于对象的静态函数cmp。
代码
/**
* 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 cmp(Interval i, Interval j){
return i.start < j.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.size() == 0 || intervals.size() == 1)
return intervals;
vector<Interval> ans;
sort(intervals.begin(), intervals.end(), cmp);
ans.push_back(intervals[0]);
for(int i = 1; i < intervals.size(); i++){
Interval tmp = ans[ans.size() - 1];
while(tmp.end >= intervals[i].end && i < intervals.size())
i++;
if(i == intervals.size()) //confirm the border
break;
if(tmp.end >= intervals[i].start && tmp.end < intervals[i].end)
{
Interval t = Interval(tmp.start, intervals[i].end);
ans.pop_back();
ans.push_back(t);
}
else if(tmp.end < intervals[i].start)
{
ans.push_back(intervals[i]);
}
}
return ans;
}
};