题目
以数组 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] 可被视为重叠区间。
思路
这题解题思路是使用排序,我们按照区间的左端点进行排序,那么在排完序的列表中,可以合并的区间一定是连续的。
我们使用数组res存储最终的答案。
首先,我们将列表中的区间按照左端点升序排列,然后我们将第一个区间加入 merged 数组,并按照顺序依次考虑之后的每个区间。
如果当前区间的左端点在数组 merged中最后一个区间的右端点之后,那么他们不会重合,我们可以直接将这个区间加入数组 merged的末尾。
否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。
AC代码
var merge = function (intervals) {
// 如果传递进来的数组长度为0 返回一个空数组
if (intervals.length === 0) {
return []
}
// 创建合并数组
var res = []
// 将数组进行升序排序
intervals.sort(function (a, b) {
return a[0] - b[0]
})
// 结果数组放进第一个数组
res.push(intervals[0])
// 从原数组的第一个元素进行遍历
for (var i = 1; i < intervals.length; i++) {
// 如果当前区间的左端点 大于 merge数组最后一个元素的右端点
if (intervals[i][0] > res[res.length - 1][1]) {
// 说明这个数组可以直接放进merge数组中
res.push(intervals[i])
} else { // 说明有区间有交集 当前区间的左端点小于等于最后一个元素的右端点
// 如果当前区间的右端点 大于 merge 最后一个右端点
if (intervals[i][1] > res[res.length - 1][1]) {
// 更新右端点为最大值
res[res.length - 1][1] = intervals[i][1]
}
}
}
return res
};
总结
本题实际是对完全包含、部分包含、完全不包含区间合并的理解。先将数据按照大小排序,剩下的问题就是区间合并,问题很容易就解决啦~ 小伙伴们,继续加油噢!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情:juejin.cn/post/693314…