简介
在编程中,我们经常需要处理区间的合并问题。一个常见的问题是合并重叠的区间,以简化问题或减少计算复杂度。本篇博客将介绍如何使用 JavaScript 解决这个问题,并提供详细的代码解析和步骤说明。
问题描述
给定一组区间,每个区间由起始值和结束值组成,需要合并重叠的区间,并返回一个不重叠的区间数组,该数组需要恰好覆盖输入中的所有区间。
力扣原题:
例如,对于输入
[[1,3],[2,6],[8,10],[15,18]],应该返回 [[1,6],[8,10],[15,18]]。
解决方案
我们可以通过以下步骤来解决这个问题:
- 排序: 按照每个区间的起始值进行排序。
- 初始化结果数组: 创建一个空数组,用于存储合并后的区间。
- 遍历区间: 从第一个区间开始,逐个检查每个区间。
- 判断重叠: 如果当前区间与结果数组中最后一个区间有重叠部分,则合并这两个区间。
- 添加新区间: 如果当前区间与结果数组中最后一个区间没有重叠,将当前区间添加到结果数组中。
- 返回结果: 遍历完所有区间后,结果数组中存储了合并后的不重叠区间。
示例
让我们看一下如何将上述解决方案应用于示例输入 [[1,3],[2,6],[8,10],[15,18]]:
-
排序后的区间为
[[1,3],[2,6],[8,10],[15,18]]。 -
初始化结果数组为
[[1,3]]。 -
遍历每个区间:
- 对于区间
[2,6],与结果数组中最后一个区间[1,3]有重叠,合并后变为[1,6]。 - 对于区间
[8,10],与结果数组中最后一个区间[1,6]没有重叠,将其添加到结果数组中。 - 对于区间
[15,18],与结果数组中最后一个区间[8,10]没有重叠,将其添加到结果数组中。
- 对于区间
-
返回结果数组
[[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;
};
提交成功: