对一个序列,将重叠的间隔进行合并。
例如:
[[1,4],[2,3]] => [[1,4]]
[[1,3],[2,6],[8,10],[15,18]] => [[1,6],[8,10],[15,18]]
难度:【medium】
思路:这道题不是很难,只要把各种case考虑到就基本可以写对。首先对序列进行排序,这里序列题目中使用的是vector<vector<int>>这个数据结构,直接调用sort函数就可以按照每个vector<int>元素进行升序排序了,不需要写比较函数。之后再对左右相邻间隔进行比较。
需要考虑到的case:
1. 常规case: 例如 [[1,3],[2,6],[8,10],[15,18]] => [[1,6],[8,10],[15,18]]
2. 边界case: 序列为空,或只有一个间隔的情况
3. 其他case: 一个间隔的范围包含在另一个间隔的内部 [[1,4],[2,3]] => [[1,4]]
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() <= 1) { return intervals; }
// 注意:这里不用写比较函数
sort(intervals.begin(), intervals.end());
vector<vector<int>> res;
/* 这里是优化前的写法,使用elem进行中转
vector<int> elem = intervals[0];
for (int i = 1; i < intervals.size(); ++i) {
if (intervals[i][0] > elem[1]) {
res.push_back(elem);
elem.pop_back();
elem = intervals[i];
} else if (intervals[i][0] < elem[1]) {
if (intervals[i][1] > elem[1]) {
elem[1] = intervals[i][1];
}
} else {
elem[1] = intervals[i][1];
}
}
if (!elem.empty()) {
res.push_back(elem);
}
*/
// 这里是优化后的代码不需要使用elem进行中转
// 每次比较只用res的back和intervals[i]比较即可
res.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); ++i) {
if (intervals[i][0] > res.back()[1]) {
res.push_back(intervals[i]);
} else {
// 这里比较巧妙,只用了一句话,只可能替换res.back()[1]
res.back()[1] = max(res.back()[1], intervals[i][1]);
}
}
return res;
}