题目:题目链接
思路:区间合并。我之前一直以为要线段树做,一直放着。今天实在不会做其他的了,就尝试用最朴素的方法做一下。没想到还过了,真是惊喜。
具体做法:先排序,然后遍历所有区间,一个一个合并。
因为你从小大排序了,就表明后面的区间一定接在前面区间后,要么和前面区间合并,要么无法合并。看代码吧:
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {//如果第一个不一样就按第一个从小到大排,否则就按照第二个从小到大排
if (a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);//其实不用cmp也可以,它默认就是从小到大
vector<vector<int> > ans;
int s = intervals[0][0], e = intervals[0][1];//初始化s,e s为起点,e为终点
for (auto& interval : intervals) {
if (interval[0] > e) {//如果没有重合部分,表示当前s,e已经是一组区间了,不能合并了。把他加入答案,同时将此时的interval更新为s,e
ans.push_back({ s,e });
s = interval[0];
e = interval[1];
}
else e = max(e, interval[1]);//有重叠,肯定是s肯定不会变,只需要取最大的e就可以了。
}
ans.push_back({ s,e });//由于最后一组区间没有加入,所以记得加入。
return ans;
}
};
时间复杂度:O(nlogn)
空间复杂度:O(n)
还是挺惊喜的。加油加油加油加油加油!!!!