「每日LeetCode」2023年2月21日

本文最后更新于:2023年3月19日 晚上

56.合并区间

56.合并区间

Category Difficulty Likes Dislikes
algorithms Medium (49.25%) 1796 -

Tags
Companies
以数组 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

Discussion | Solution

思路

按首先,输入数组 intervals 根据每个区间的起始时间升序排序。这是通过使用 sort() 方法和一个自定义比较函数完成的,该函数比较每个区间的起始时间。
然后,一个 for 循环遍历除最后一个区间外的所有区间。对于每一对相邻的区间 i 和 j,代码检查 j 是否在 i 结束之后开始。如果是这种情况,区间不重叠,循环将继续移动到下一对区间。如果 j 在 i 结束之前或在同一时刻开始,那么这两个区间重叠并需要合并。
为了合并区间,代码从数组中删除这两个区间,并用一个新区间来替换它们,该新区间与第一个区间(startI)相同,并且在两个区间中的最大结束时间(Math.max(endI, endJ))处结束。循环变量 i 减小,以考虑从数组中删除两个区间。
最后,排序和合并的区间作为函数的输出返回。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
* @lc app=leetcode.cn id=56 lang=javascript
*
* [56] 合并区间
*/

// @lc code=start
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function (intervals) {
intervals.sort((a, b) => a[0] - b[0]);
for (let i = 0; i < intervals.length - 1; i++) {
const [startI, endI] = intervals[i];
const [startJ, endJ] = intervals[i + 1];
if (startJ > endI) continue;
intervals.splice(i, 2, [startI, Math.max(endI, endJ)]);
i--;
}
return intervals;
};
// @lc code=end