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

56. 合并区间(Merge Intervals)——C语言高质量题解

题目描述

给你一个区间集合intervals,其中每个区间为[start, end],请合并所有重叠区间,并返回一个不重叠的区间数组,覆盖所有输入区间。

示例

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]]

示例 2:

输入: intervals = [[1,4],[4,5]] 输出: [[1,5]]

解题思路

1️⃣ 排序

先按区间起点升序排序:

  • 保证遍历时,所有可能重叠的区间是连续的

2️⃣ 遍历合并

维护当前区间[start, end]

  • 不重叠:保存当前区间 → 更新为新区间

  • 重叠:更新end = max(end, intervals[i][1])

3️⃣ 最后一个区间

循环结束后,记得把最后的[start, end]加入结果。


图解

假设输入:

[[1,3],[2,6],[8,10],[15,18]]
  1. 排序后:

[[1,3],[2,6],[8,10],[15,18]]
  1. 合并[1,3][2,6][1,6]

  2. [8,10]不重叠 → 直接加入

  3. [15,18]不重叠 → 直接加入

最终结果:

[[1,6],[8,10],[15,18]]

C语言实现

#include <stdlib.h> // 排序函数:按区间起点升序 int cmp(const void* a, const void* b) { int* p1 = *(int**)a; int* p2 = *(int**)b; return p1[0] - p2[0]; } int** merge(int** intervals, int intervalsSize, int* intervalsColSize, int* returnSize, int** returnColumnSizes) { if (intervalsSize == 0) { *returnSize = 0; return NULL; } qsort(intervals, intervalsSize, sizeof(int*), cmp); int** res = (int**)malloc(sizeof(int*) * intervalsSize); *returnColumnSizes = (int*)malloc(sizeof(int) * intervalsSize); int count = 0; int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 1; i < intervalsSize; i++) { if (intervals[i][0] > end) { res[count] = (int*)malloc(sizeof(int) * 2); res[count][0] = start; res[count][1] = end; (*returnColumnSizes)[count] = 2; count++; start = intervals[i][0]; end = intervals[i][1]; } else { if (intervals[i][1] > end) end = intervals[i][1]; } } // 加入最后一个区间 res[count] = (int*)malloc(sizeof(int) * 2); res[count][0] = start; res[count][1] = end; (*returnColumnSizes)[count] = 2; count++; *returnSize = count; return res; }

易错点

  1. 没有排序

    • 若不排序,合并逻辑会失败

  2. 忘记最后一个区间

    • 循环结束后必须手动加入

  3. malloc/returnColumnSizes

    • LeetCode 题要求返回的数组必须 malloc

  4. 重叠条件

    • 注意intervals[i][0] <= end才算重叠


时间复杂度

  • 排序:O(n log n)

  • 遍历合并:O(n)

  • 总计O(n log n)

空间复杂度

  • 返回数组:O(n)

  • 排序原数组如果用 qsort 可以原地排序,额外空间O(log n)(qsort递归栈)


总结

  1. 排序保证顺序

  2. 遍历 + 贪心合并

  3. 注意内存分配与返回格式

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

相关文章:

  • DMDRS二进制安装包部署搭建(DM8单机版)
  • 拒绝做“代码蝉”:研发团队如何设计“有感”的微愿景?
  • Face Analysis WebUI保姆级教程:3步完成GPU加速的人脸属性分析环境部署
  • Tantivy 与 Milvus 的深度整合:倒排索引在向量搜索中的性能优化实践
  • OpenCore Legacy Patcher:3大突破让旧Mac重获新生的系统兼容性优化指南
  • SOONet部署案例:Kubernetes集群中SOONet服务容器化与水平扩缩容实践
  • 4步解锁旧Mac潜能:OpenCore Legacy Patcher技术指南
  • FPGA工程师面试汇总(五)
  • 前缀和力扣题(leetcode)
  • 155. 最小栈(MinStack)题解
  • BAAI/bge-m3快速入门:3步搭建你的第一个语义相似度分析工具
  • OpenClaw云端体验:通过星图平台快速试用GLM-4.7-Flash镜像
  • 实测|WSL2 从零部署 OpenClaw AI 助手:安装配置与实战运行教程
  • 从电子表到服务器:聊聊32.768kHz这颗“时间之心”的封装变迁史(DT-26、SMD3225对比)
  • OBS Studio直播架构解析:多源场景管理与实时转场性能优化
  • FastReport安装避坑指南:Delphi开发者必知的5个关键步骤
  • AI 大模型绘图日常使用教程|零门槛上手,快速出图不踩坑
  • OpenLdap部署
  • 2026年GPT-5.4实战应用完全指南
  • OBS多平台直播解决方案:obs-multi-rtmp插件全攻略
  • 造相-Z-Image效果对比:BF16 vs FP16在4090上的画质与稳定性差异
  • 多无人机协同避障之自适应重构 V 型编队与分布式控制算法探索
  • 【应用】运营营销人该如何看待OpenClaw?
  • 【唠嗑第二嗑-代码里面的无为思想,空空如也的接口】
  • AI 对人类的影响与普通人的应对策略
  • Bing SEO优化实战:从零开始提升网站排名的5个关键步骤
  • 从 Hugging Face 到本地:ProcessorMixin 模型保存与加载的完整指南
  • 基于 Simulink 的 多目标优化:效率 + 动态响应 + 纹波
  • Python爬虫实战:如何绕过央视频加密获取高清视频源(附完整代码)
  • BiliTools全能B站资源下载工具:高效获取视频资源的新手必备指南