普通数组——合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
这是一道经典的排序 + 遍历合并问题,核心问题:先按区间起点排序,再逐个合并重叠区间。
使用sort对二维数组intervals进行排序:sort(intervals.begin(), intervals.end());
C++ 对二维数组 /vector 默认排序规则:
- 先比较每个区间的第一个数(start)
- 如果第一个数相等,再比较第二个数(end)
- 整体按照 从小到大升序排列
核心逻辑解释:
1、排序
必须先按区间左端点从小到大排序,这样能保证后续只需要和结果中最后一个区间比较是否重叠
2、合并规则
遍历每个区间,只和结果里最后一个区间比较:
- 重叠/相邻(当前区间起点<=最后区间终点):合并,更新最后区间的终点为两者最大值
- 不重叠:直接把当前区间加入结果
3、复杂度
- 时间复杂度:O(n log n)(主要耗时在排序)
- 空间复杂度:O(1)(不算结果存储)
完整代码实现如下:
#include
#include
#include
using namespace std;
// 合并重叠区间
vector<vector
// 1. 空数组直接返回
if (intervals.empty()) return {};
// 2. 按区间的 左端点 从小到大排序
sort(intervals.begin(), intervals.end());
// 3. 存储最终合并结果
vector<vector
// 先把第一个区间放入结果
res.push_back(intervals[0]);
// 4. 遍历剩余区间,逐个合并
for (int i = 1; i < intervals.size(); ++i) {
// 取出结果中最后一个区间(方便修改)
auto& last = res.back();
// 当前区间的起点
int curr_start = intervals[i][0];
// 当前区间的终点
int curr_end = intervals[i][1];
// 情况1:重叠 / 相邻 → 合并
if (curr_start <= last[1]) {
// 更新终点为两个区间终点的最大值
last[1] = max(last[1], curr_end);
}
// 情况2:不重叠 → 直接加入结果
else {
res.push_back(intervals[i]);
}
}
return res;
}
// 测试主函数
int main() {
// 测试用例1:常规重叠
vector<vector
vector<vector
cout << "合并结果1:";
for (auto& p : res1) {
cout << "[" << p[0] << "," << p[1] << "] ";
}
cout << endl;
// 测试用例2:相邻区间
vector<vector
vector<vector
cout << "合并结果2:";
for (auto& p : res2) {
cout << "[" << p[0] << "," << p[1] << "] ";
}
return 0;
}
浙公网安备 33010602011771号