news 2026/5/30 17:24:44

贪心算法专题(十四):万流归宗——「合并区间」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心算法专题(十四):万流归宗——「合并区间」

哈喽各位,我是前端L。

欢迎来到贪心算法专题第十四篇!

题目很简单:给你一堆乱序的区间,比如 [1,3], [8,10], [2,6], [15,18]。

请你把重叠的区间合并。

  • [1,3][2,6]重叠,合并后变成[1,6](取最小起点,最大终点)。

  • [8,10][15,18]没人理它们,保持原样。

  • 最终输出:[[1,6], [8,10], [15,18]]

力扣 56. 合并区间

https://leetcode.cn/problems/merge-intervals/

题目分析:

  • 输入intervals数组。

  • 输出:合并后的数组。

核心思维:排序 + 动态更新右边界

依然是老套路:先按 Start 排序。

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

贪心策略:

我们将第一个区间放入结果集 result 中作为**“当前正在合并的区间”**。

然后遍历后面的区间:

  1. 重叠了?(当前.start <= 结果集中最后一个.end)

    • 不需要新增区间。

    • 合并操作:我们要把结果集里那个区间的右边界撑大。

    • 新的右边界 =Math.max(结果集.end, 当前.end)

    • 注意:这里取 Max,因为我们要尽可能包含更多的范围(合并)。这与“射气球”取 Min(找交集)正好相反。

  2. 没重叠?

    • 说明当前结果集里的那个区间已经合并完毕,无法再向后延伸了。

    • 直接把当前区间 push 进结果集,作为新的“正在合并对象”。

算法流程 (JavaScript)

  1. 特判:长度为 0 或 1 直接返回。

  2. 排序intervals.sort((a, b) => a[0] - b[0])

  3. 初始化result = [intervals[0]]

  4. 遍历:从i = 1开始。

    • 取出result的最后一个元素last

    • 取出当前遍历元素cur

    • 如果cur[0] <= last[1](有重叠):

      • last[1] = Math.max(last[1], cur[1])(直接修改 result 里的元素)。

    • 否则:

      • result.push(cur)

  5. 返回result

代码实现

JavaScript

/** * @param {number[][]} intervals * @return {number[][]} */ var merge = function(intervals) { if (intervals.length === 0) return []; // 1. 按左边界从小到大排序 intervals.sort((a, b) => a[0] - b[0]); // 初始化结果集,先把第一个放进去 const result = [intervals[0]]; // 2. 从第二个开始遍历 for (let i = 1; i < intervals.length; i++) { let cur = intervals[i]; // 获取结果集中“当前正在合并”的那个区间(也就是最后一个) let last = result[result.length - 1]; // 判断是否重叠 // 当前区间的左边界 <= 上一个区间的右边界 if (cur[0] <= last[1]) { // 发现重叠!执行合并 // 只需要更新右边界,左边界肯定是用 last[0] (因为它更小,排序保证的) // 右边界要取两者中最大的,这样才能包住两个区间 last[1] = Math.max(last[1], cur[1]); } else { // 没有重叠,直接放入结果集 result.push(cur); } } return result; };

深度辨析:区间三兄弟总结

这三道题(452射气球, 435无重叠, 56合并)是区间问题的“三驾马车”。它们的第一步永远是Sort by Start

区别在于处理重叠时的贪心决策

题目目标重叠时的操作边界更新策略
452. 射气球找公共交集箭数不变,范围变小end = Math.min(取交集)
435. 无重叠丢弃区间移除数+1,保留短的end = Math.min(为了不挡路)
56. 合并区间融合区间区间数不变,范围变大end = Math.max(取并集)

记住这个表格,区间问题就通关了!

复杂度分析

  • 时间复杂度:O(N log N)

    • 瓶颈在排序。遍历只是 O(N)。

  • 空间复杂度:O(N)

    • 需要一个result数组来存储结果(如果那是返回值不算额外空间,则是 O(log N) 的排序栈空间)。

下一题预告:单调递增的数字

区间问题到此结束! 接下来我们要处理一道非常有意思的数字逻辑题

  • 给定一个非负整数N

  • 找出小于或等于N的最大整数,同时这个整数每一位上的数字都要是单调递增的。

  • 比如N = 10-> 输出9

  • 比如N = 1234-> 输出1234

  • 比如N = 332-> 输出299

这道题的贪心策略在于:一旦发现某一位比后面一位大(破坏了单调性),就得把这一位减 1,然后把后面所有位都变成 9。就像做借位减法一样。

准备好玩数字了吗?下期见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 18:21:13

**反射**

一、类对象1.反射&#xff1a;允许在程序运行状态中&#xff0c;可以获取任意类中的属性和方法&#xff0c;并且可以操作任意对象内部的属性和方法&#xff0c;这种动态获取类的信息及动态操作对象的属性和方法对应的机制称为反射机制。2.类的对象&#xff1a;基于某个类new出来…

作者头像 李华
网站建设 2026/5/29 4:39:16

应用——基于C语言实现的简易Web服务器开发

基于C语言实现的简易Web服务器开发一、项目概述本项目是一个基于C语言实现的多功能简易Web服务器&#xff0c;支持HTTP/1.1协议&#xff0c;能够处理HTML页面、图片文件请求&#xff0c;并实现基本的登录验证功能。二、项目文件结构项目目录/ ├── 01ser.c # 主服务…

作者头像 李华
网站建设 2026/5/29 1:00:37

Java计算机毕设之基于springboot的美食信息推荐系统的设计与实现 -基于springboot的美食网站设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/29 23:28:07

计算机Java毕设实战-基于springboot的美食制作方法推荐网站设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/30 13:29:40

BusyBox入门指南:DevOps专家的轻量级工具箱

在容器化的世界里&#xff0c;最强大的工具往往是最小的那个。当标准Ubuntu基础镜像超过70MB时&#xff0c;BusyBox仅用不到5MB就提供了80%的日常运维功能。一、BusyBox是什么&#xff1f;一个二进制文件的多重身份 想象一下&#xff0c;你有一个工具箱&#xff0c;里面装满了各…

作者头像 李华
网站建设 2026/5/20 23:24:26

传统管理问题多,智能插座为高校宿舍违规电器治理开新路

在高校宿舍管理中&#xff0c;违规电器治理长期面临“发现难、误判多、管控难”的现实困境。电水壶、电热锅、电磁炉等设备往往以临时接入、间歇使用的方式规避检查&#xff0c;单纯依靠人工巡查或功率阈值断电&#xff0c;既难以及时发现风险&#xff0c;也容易影响正常用电体…

作者头像 李华