合并前必须先排序,否则结果不可靠;区间合并依赖左端点升序排列以支持线性扫描判断重叠,C++中常用std::sort配合lambda按a[0]升序排序。

合并前必须先排序,否则结果不可靠
区间合并本质依赖顺序:只有按左端点升序排列后,才能线性扫描并判断是否重叠。C++ 中最直接的方式是用 std::sort 配合 lambda 表达式:
std::sort(intervals.begin(), intervals.end(), [](const auto& a, const auto& b) {
return a[0] < b[0];
});
注意不能只比 a[0] —— <code>std::sort 要求严格弱序(strict weak ordering),相等时必须返回 false,否则可能触发未定义行为或运行时崩溃(尤其在 libstdc++ 的 debug 模式下会报错)。
判断重叠的条件是 current[0]
排序后,设上一个已合并区间为 merged.back(),当前待处理区间为 intervals[i]。重叠的充要条件是:
intervals[i][0] (当前左端点 ≤ 上一个右端点)- 此时新区间右端点应更新为
std::max(merged.back()[1], intervals[i][1])
常见错误是写成 而非 <code>:比如 <code>[1,4] 和 [4,5] 是相邻而非重叠,但题目中“非重叠区间合并”通常要求将相邻区间也合并(即闭区间语义),所以必须用 。若题意明确要求“严格重叠”,才改用 <code>。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
使用 vector<vector>></vector> 时避免反复 push_back 引发内存重分配
如果输入规模较大(如十万级区间),合并结果数量远小于输入,频繁 push_back 可能触发多次 vector 扩容。可预先调用:
merged.reserve(intervals.size());
更稳妥的做法是在排序后,用双指针原地覆盖(仅适用于允许修改输入的场景);否则就老实用 reserve,它不改变逻辑,但能稳定提升 10%~20% 性能。
边界情况:空输入、单区间、全重叠需手动验证
这三类容易被忽略,但实际测试常卡在这里:
- 输入
vector<vector>>{}</vector>→ 输出必须是空vector,不是{{}} - 输入
{{1,2}}→ 直接返回原数组,不能漏掉这个元素 - 输入
{{1,5},{2,3},{4,6}}→ 应合并为{{1,6}},不是{{1,5},{4,6}}
建议在循环前加守卫判断:if (intervals.empty()) return {};,然后初始化 merged 为 {intervals[0]},再从 i = 1 开始遍历——这样比每次检查 merged.empty() 更清晰,也避免分支预测失败带来的微小开销。

















