两区间重叠当且仅当a
怎么判断两个区间是否重叠
关键不是看“有没有交集”,而是用不等式避开边界讨论:
[a, b]和[c, d]重叠 ⇔a 。反过来说,不重叠的充要条件是 <code>b ,这个写法能直接绕开开闭区间、端点相等时的各种歧义。常见错误是写成
a (漏掉等于),结果 <code>[1,2]和[2,3]被判为不重叠——但实际它们在端点 2 处接触,按大多数业务需求(如时间调度、内存段合并)是要合并的。
- 如果业务明确要求“必须有长度交集”,才用严格小于
- 输入区间默认满足
left ,否则先做校验或归一化- C++ 中比较
int没问题,但若含double,要考虑浮点误差,建议用std::abs(a - b) 替代直接等号sort + 一次遍历就能合并,别写嵌套循环
核心思路:先按
left升序排序,然后线性扫描,维护当前正在扩展的merged区间。每次遇到新区间,只和merged的右端比较,不用回查前面所有区间。性能上,
O(n log n)主要花在排序;遍历本身是O(n)。有人试图用 map 或 set 动态维护,反而引入O(n log n)插入开销且逻辑更脆。立即学习“C++免费学习笔记(深入)”;
- 排序时若
left相同,按right降序排(greater),这样相同起点的大区间先被处理,小的会被自然吞掉,少一次合并判断- 用
vector<vector>></vector>存区间?注意vector的拷贝成本,大数组建议传引用或用span(C++20)- 原地合并?可以,但需手动管理输出位置索引,易错;推荐新建
result容器,语义清晰std::sort 的比较函数怎么写才不出错
别直接写
a[0] 就完事。如果区间是 <code>pair<int int></int>,得用std::tie避免手写逻辑漏洞;如果是自定义结构体,必须重载operator 或传 lambda,且保证严格弱序。典型翻车点:
[1,5], [1,3], [1,8]排序后变成[1,5], [1,3], [1,8](没按右端降序),导致合并出[1,5]→[1,5](跳过[1,3])→[1,8],最终多出一个中间结果。
- 正确 lambda 示例:
[&](const auto& x, const auto& y) { return x[0] != y[0] ? x[0] y[1]; }- 用
std::pair?直接sort(v.begin(), v.end())就行,它默认按 first 升序、second 升序——但你要的是 second 降序,所以必须显式传比较器- 编译期检查:加
static_assert确保区间类型可比较,比如static_assert(std::is_same_v<decltype int>);</decltype>合并后端点溢出或越界怎么办
如果输入含极大值(如
INT_MAX)或极小值(INT_MIN),合并时max(right1, right2)可能不变,但逻辑上没问题;真正危险的是计算型区间(比如由坐标差生成),此时right = left + len可能溢出。不要等运行时报
signed integer overflow——UB 在 C++ 里不保证报错,可能静默错算。尤其在 LeetCode 类平台,测试数据常故意塞边界值。
- 用
long long中转比较,但最终存回int前必须检查是否截断(if (val > INT_MAX || val )- 若业务允许,统一用
int64_t表示端点,省去转换麻烦- STL 算法不帮你防溢出,
std::max对int溢出无感知,该崩还是崩合并逻辑本身很简单,难的是对输入鲁棒性和边界的诚实处理——比如空输入、单区间、全重叠、全不重叠,这些 case 往往比主干逻辑更消耗调试时间。
0
0
相关文章
C++ int指针自增是什么意思 C++ 指针偏移量计算【高级】
C++ short占几个字节 C++ short int内存大小是多少【说明】
C++怎么用智能指针 C++中shared_ptr用法【深度】
C++ short类型常见报错 C++ short int调试技巧【总结】
C++怎么安装库 C++使用NuGet安装第三方依赖【教程】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。
22
2026.03.10
本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。
48
2026.03.09
本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。
93
2026.03.06
本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。
216
2026.03.05
本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。
413
2026.03.04
2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!
143
2026.03.04
本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。
221
2026.03.03
本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。
31
2026.03.03
热门下载
相关下载
最新文章



