JavaScript 算法解析:合并重叠区间

238 阅读3分钟

简介

在编程中,我们经常需要处理区间的合并问题。一个常见的问题是合并重叠的区间,以简化问题或减少计算复杂度。本篇博客将介绍如何使用 JavaScript 解决这个问题,并提供详细的代码解析和步骤说明。

问题描述

给定一组区间,每个区间由起始值和结束值组成,需要合并重叠的区间,并返回一个不重叠的区间数组,该数组需要恰好覆盖输入中的所有区间。

力扣原题:

image.png 例如,对于输入 [[1,3],[2,6],[8,10],[15,18]],应该返回 [[1,6],[8,10],[15,18]]

解决方案

我们可以通过以下步骤来解决这个问题:

  1. 排序: 按照每个区间的起始值进行排序。
  2. 初始化结果数组: 创建一个空数组,用于存储合并后的区间。
  3. 遍历区间: 从第一个区间开始,逐个检查每个区间。
  4. 判断重叠: 如果当前区间与结果数组中最后一个区间有重叠部分,则合并这两个区间。
  5. 添加新区间: 如果当前区间与结果数组中最后一个区间没有重叠,将当前区间添加到结果数组中。
  6. 返回结果: 遍历完所有区间后,结果数组中存储了合并后的不重叠区间。

示例

让我们看一下如何将上述解决方案应用于示例输入 [[1,3],[2,6],[8,10],[15,18]]

  1. 排序后的区间为 [[1,3],[2,6],[8,10],[15,18]]

  2. 初始化结果数组为 [[1,3]]

  3. 遍历每个区间:

    • 对于区间 [2,6],与结果数组中最后一个区间 [1,3] 有重叠,合并后变为 [1,6]
    • 对于区间 [8,10],与结果数组中最后一个区间 [1,6] 没有重叠,将其添加到结果数组中。
    • 对于区间 [15,18],与结果数组中最后一个区间 [8,10] 没有重叠,将其添加到结果数组中。
  4. 返回结果数组 [[1,6],[8,10],[15,18]]

代码解析

以下是使用 JavaScript 实现上述解决方案的代码:

var merge = function(intervals) {
    // 定义结果数组
    let res = [];
    
    // 按照起始值对区间进行排序
    intervals.sort((a, b) => a[0] - b[0]);

    // 初始化 prev 为第一个区间
    let prev = intervals[0];

    // 遍历排序后的区间数组
    for (let i = 1; i < intervals.length; i++) {
        let cur = intervals[i]; // 当前区间

        // 如果当前区间的起始值小于等于 prev 区间的结束值,说明有重叠部分
        if (prev[1] >= cur[0]) {
            // 更新 prev 区间的结束值为当前区间的结束值与 prev 区间的结束值的最大值
            prev[1] = Math.max(cur[1], prev[1]); 
        } else { // 如果当前区间与 prev 区间不重叠
            // 将 prev 区间推入结果数组
            res.push(prev);
            // 更新 prev 为当前区间
            prev = cur;
        }
    }

    // 将最后一个 prev 区间推入结果数组
    res.push(prev);

    // 返回结果数组
    return res;
};

提交成功:

image.png