Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 23-合并区间.mdx
目录
题目思路代码
1292 字
约 4 分钟
更新于 2026/08/20

合并区间

题目

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

示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

思路

  • 首先将给定二维数组 arr,按照第一个元素,由小到大排序。
  • 取第一个数组的两个元素,作为结果集中的第一个元素 [[start, end]]。
  • 循环 arr,每次将当前 item[0] 和 end 比较:
    • 如果 item[0] > end 则说明符合题意的第一个结果已经出现,放入 result 中,继续循环。
    • 如果 item[0] <= end && item[1] > end,此时需要更新 end 值为 item[1]

代码:

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function(intervals) {
  // 先将数组排序,按每个元素第一个数字大小,由小到大进行排序。
    const arr = intervals.sort((a, b) => a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);
 
    const result = []; // 声明结果集
    let [start, end] = [arr[0][0], arr[0][1]]; // 取第一个元素的两个值
    for (let i = 1; i < arr.length; i++) {
        if (arr[i][0] > end) {
            /**
             * 如果第 i 个 item 的第一个数字 大于 end ,
             * 那说明已经出现一个结果集合,需要存如 result ,并且更新 start 和 end
             * */
            result.push([start, end]);
            start = arr[i][0];
            end = arr[i][1];
        } else if (arr[i][1] > end) {
            /**
             * 如果第 i 个 item 的第一个数字 小于 end 且 第 i 个 item 的第二个数字 大于 end,
             * 则说明当前 item 和 当前的 [start, end] 可以合并,此时更新 end 值即可。
             * */
            end = arr[i][1];
        }
    }
 
    result.push([start, end]);
    return result;
};