相似的题目:
2580. 统计将重叠区间合并成组的方案数(javascript)
以数组 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
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function (intervals) {
intervals.sort((a, b) => a[0] - b[0])
let len = intervals.length
let list = []
for (let i = 0; i < len;) {
let max = intervals[i][1]
let j = i + 1
while (j < len && intervals[j][0] <= max) {
max = Math.max(max, intervals[j][1])
j++
}
list.push([intervals[i][0], max])
i = j
}
return list
};
解题思路
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function (intervals) {
//将数据按照 左侧项 进行排序
intervals.sort((a, b) => a[0] - b[0])
// 获取数据的长度
let len = intervals.length
//用一个新的数组进行返回
let list = []
for (let i = 0; i < len;) {
// 用 当前项的右侧数据 作为 最大项
let max = intervals[i][1]
//当前项的下一项
let j = i + 1
// //循环需要小于len 下一项的左侧项<=最大项 符合这两个条件继续循环,获取最大项,为什么用intervals[j][1]更新最大值呢,因为【小值,大值】,所以用的第二个下标是1
while (j < len && intervals[j][0] <= max) {
max = Math.max(max, intervals[j][1])
j++
}
//intervals[i][0] 当前项的左侧数据为最小数,获取的max为最大项
list.push([intervals[i][0], max])
i = j
}
return list
};