当前位置: 首页 > news >正文

普通数组——合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

这是一道经典的排序 + 遍历合并问题,核心问题:先按区间起点排序,再逐个合并重叠区间
使用sort对二维数组intervals进行排序:sort(intervals.begin(), intervals.end());
C++ 对二维数组 /vector 默认排序规则:

  1. 先比较每个区间的第一个数(start)
  2. 如果第一个数相等,再比较第二个数(end)
  3. 整体按照 从小到大升序排列

核心逻辑解释:
1、排序
必须先按区间左端点从小到大排序,这样能保证后续只需要和结果中最后一个区间比较是否重叠

2、合并规则
遍历每个区间,只和结果里最后一个区间比较:

  • 重叠/相邻(当前区间起点<=最后区间终点):合并,更新最后区间的终点为两者最大值
  • 不重叠:直接把当前区间加入结果

3、复杂度

  • 时间复杂度:O(n log n)(主要耗时在排序)
  • 空间复杂度:O(1)(不算结果存储)

完整代码实现如下
#include
#include
#include // 排序函数需要
using namespace std;

// 合并重叠区间
vector<vector> merge(vector<vector>& intervals) {

// 1. 空数组直接返回
if (intervals.empty()) return {};// 2. 按区间的 左端点 从小到大排序
sort(intervals.begin(), intervals.end());// 3. 存储最终合并结果
vector<vector<int>> res;
// 先把第一个区间放入结果
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<int>> intervals1 = {{1,3},{2,6},{8,10},{15,18}};
vector<vector<int>> res1 = merge(intervals1);
cout << "合并结果1:";
for (auto& p : res1) {cout << "[" << p[0] << "," << p[1] << "] ";
}
cout << endl;// 测试用例2:相邻区间
vector<vector<int>> intervals2 = {{1,4},{4,5}};
vector<vector<int>> res2 = merge(intervals2);
cout << "合并结果2:";
for (auto& p : res2) {cout << "[" << p[0] << "," << p[1] << "] ";
}return 0;

}

http://www.jsqmd.com/news/554072/

相关文章:

  • Windows 7 SP2重构方案:现代硬件适配与系统焕新体验
  • 先锋云盾网络验证系统|易语言源码接入支持x32架构|代理后台无限生成卡密+灵活时长定制
  • springboot-vue基于web框架的服装销售商城平台
  • 最新版Microsoft Office 2024破解版一键安装永久使用,可密钥永久激活
  • Aider终极指南:5种高效场景化AI结对编程解决方案
  • 突破性文件传输技术:CameraFileCopy让手机摄像头变身为数据通道
  • BepInEx终极指南:快速上手Unity游戏插件框架
  • 2026年苏州工艺精湛的木托盘制造厂排名,性价比高的品牌有哪些 - 工业设备
  • 实战对比:ext4 vs NTFS vs XFS vs Btrfs vs ZFS - 哪个文件系统最适合你的SSD?
  • 倍增算法学习
  • 笛卡尔——首要之事,是尽己所能摒弃一切先入之见
  • 5分钟实战指南:免费解锁海尔智能家居完整接入HomeAssistant方案
  • Go HTTP Server 性能分析与优化
  • 别再乱找 IT 服务商了!南京这家全栈方案商,从 AI 服务器到数据中心一站式搞定
  • Qwen3-VL-8B开源AI聊天系统效果展示:多语言混合输入理解能力
  • 桌面分区管理新范式:NoFences如何通过空间容器技术提升工作效率
  • Vue2老项目迁移Vite实战:FFmpeg前端视频剪辑避坑指南
  • Anything to RealCharacters 2.5D转真人引擎用户反馈闭环:错误日志收集与体验优化路径
  • 传统仪器测量无时间标记,程序自动给每条数据打上时间戳,方便追溯测量时刻。
  • 鸿蒙(HarmonyOS)ArkTS 实战:animate属性动画可复用圆形扩散菜单
  • Qt 串口编程实战:keySight 34401A 万用表数据采集与存储
  • FlowState Lab参数调优实战:如何获得理想的模拟精度与速度
  • SpringBoot锁设计:让你的系统不再“抢”出问题!
  • 如何完整保存QQ空间历史记录?GetQzonehistory让数字回忆不再流失
  • ncmdump:破解NCM格式枷锁的音频自由解决方案
  • 别再只盯着model.score()了!Python机器学习模型评估的5种实用方法对比
  • Windows 11 LTSC微软商店终极解决方案:3分钟实现应用生态完整集成
  • 自动化深度学习-AutoKeras-和-Keras-Tuner-的温和介绍
  • 别再让蜂鸣器只会‘哔哔’叫了!用STM32F103的PWM和电容,DIY你的家电提示音库(附超级玛丽彩蛋)
  • 5分钟快速上手:使用Ag-PSD高效处理Photoshop文档的完整指南