跳到主要内容

区间合并

区间合并(Merge Intervals)是一个常见的前端面试题,通常涉及到对一组区间进行合并,使得不重叠的区间合并成一个新的区间。这类问题可以用于处理日程安排、时间区间的操作等。下面是一个典型的区间合并问题:

问题描述

给定一个包含多个区间的数组 intervals,每个区间由两个整数 startend 组成,表示区间的开始和结束。合并所有重叠的区间,并返回合并后的数组。

示例

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

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

解释:区间 [1,3][2,6] 重叠,合并成 [1,6]

解决方法

一种解决这个问题的方法是先将区间按照起始位置排序,然后遍历排序后的区间数组,依次合并重叠的区间。具体步骤如下:

  1. 将区间数组按照起始位置从小到大排序。
  2. 初始化一个空数组 result 用于存储合并后的区间。
  3. 遍历排序后的区间数组,如果当前区间的起始位置大于 result 数组中最后一个区间的结束位置,说明不重叠,直接将当前区间加入 result 数组。如果重叠,更新 result 数组中最后一个区间的结束位置为当前区间的结束位置。
  4. 返回 result 数组作为结果。

下面是一个 JavaScript 的实现例子:

function merge(intervals) {
if (intervals.length <= 1) {
return intervals;
}

intervals.sort((a, b) => a[0] - b[0]);
let result = [intervals[0]];

for (let i = 1; i < intervals.length; i++) {
let currentInterval = intervals[i];
let lastInterval = result[result.length - 1];

if (currentInterval[0] <= lastInterval[1]) {
lastInterval[1] = Math.max(lastInterval[1], currentInterval[1]);
} else {
result.push(currentInterval);
}
}

return result;
}

// 示例用法
let intervals = [
[1, 3],
[2, 6],
[8, 10],
[15, 18]
];
let mergedIntervals = merge(intervals);
console.log(mergedIntervals); // 输出 [[1,6],[8,10],[15,18]]