Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
比较常见的思路(贪心思想):
- 将区间按照start值排序,得到的interval的start值是从小到大的。
- 先将interval的第一个区间放进结果中,然后遍历interval中的区间。
- 将interval中的start值和res中最后的区间的end值进行比较,若前者比后者大,则两个区间没有交集,则将该区间加入到res中;反之,则两个区间有交集,则当前res区间的end值要变更为两者end值的最大值。
/**
* 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(const Interval &a,const Interval &b){
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
int n=intervals.size();
if(n<2) return intervals;
sort(intervals.begin(),intervals.end(),cmp);
res.push_back(intervals[0]);
for(int i=1,j=0;i<n;++i){
if(res[j].end<intervals[i].start){
res.push_back(intervals[i]);
j++;
}
else{
res[j].end=max(res[j].end,intervals[i].end);
}
}
return res;
}
};
- 关于res的处理,我用了一个变量j来控制,但参考了其他的,发现可以直接用res.back(),因为只是把res最后的那个和interval中的区间进行比较。
sort(intervals.begin().start,intervals.end().start);//这样是不行的
P.S 一定要有开头的特殊情况判断,不然又会报错。
难想的思路
将区间分别按start,end排序,若前一个区间的end大于后一个区间的start就合并。
(其实这一个我不太理解,为什么start和end分别排序了之后,这样的比较还能关联到原区间?望大佬告知)
/**
* 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:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
int n=intervals.size();
vector<int> starts;
vector<int> ends;
for(int i =0;i<n;i++) starts.push_back(intervals[i].start);
for(int i =0;i<n;i++) ends.push_back(intervals[i].end);
sort(starts.begin(),starts.end());
sort(ends.begin(),ends.end());
for(int i=0,j=0;i<n;i++){
if(i==n-1 || starts[i+1]>ends[i]){
Interval tmp(starts[j],ends[i]);
res.push_back(tmp);
j=i+1;
}
}
return res;
}
};
写这个代码的时候遇到一个奇怪的问题,定义starts、ends的时候,加入个数作为参数,但这样后面给starts,ends赋值的for循环执行之后,两个vector中的元素都为空。
vector<int> starts(n);
vector<int> ends(n);
我以为是因为不能用不明确的标量,于是写了一个程序在本地测试发现,即使用明确的数字定义,赋值之后都是0。
查询了一下发现,原来是因为,push_back是在最后面添加.That’s really embarrassing .
如果实现申明了vector大小,就直接访问其中某一个位置,而不是用push_back。
(我真是一只辣鸡)
(另外我还想吐槽一下这个编辑博客插图片的时候,常常出现点击了上传图片之后就没有之后的情况啊!!!)