版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsszwc/article/details/87868564
题目:
https://leetcode-cn.com/problems/merge-intervals/submissions/
题意:
给出一个区间的集合,请合并所有重叠的区间。端点重叠也要合并
思路:
首先对区间排序,首先按左端点升序排序,如果左端点相等,那么按右端点升序排序,然后线性扫描一遍:
- 对于扫描到的当前区间,如果其左端点在已知区间的右端点左侧,那么就可以合并区间,并且取两个区间右端点的最大值做为新区间的右端点;
- 否则无法合并,把已知区间加入答案合集中,把扫描的当前区间作为新的已知区间,继续扫描
代码:
/**
* 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) {
sort(intervals.begin(), intervals.end(), [](const Interval& a, const Interval& b) {
return a.start != b.start ? a.start < b.start : a.end < b.end;
});
vector<Interval> ans;
Interval temp;
for(int i = 0; i < intervals.size(); i++) {
if(i == 0) {
temp = intervals[i];
} else {
if(intervals[i].start <= temp.end) {
temp.end = max(temp.end, intervals[i].end);
} else {
ans.emplace_back(temp);
temp = intervals[i];
}
}
}
//把最后一个区间加入到答案中
if(!intervals.empty()) {
ans.emplace_back(temp);
}
return ans;
}
};