每天学习一点算法 2026/03/26
题目:合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
我这里首先想到的方法是,维护一个存储结果区间的数组 res 和 指向最新元素的 index,首先将 intervals 的第一个区间放进去,然后遍历剩余的区间,判断区间是否重合,重合就合并index不变,未重合就将区间 push 进 res,index++(由于区间顺序不确定,所以这种方法需要排序)
typescript
function merge(intervals: number[][]): number[][] {
if (intervals.length < 2) return intervals // 只有一个区间直接返回
intervals = intervals.sort((a, b) => a[0] - b[0]) // 按区间左边界排序
const res: number[][] = [intervals[0]] // 初始放入最小的区间
let index = 0 // 初始指向第一个区间
// 遍历剩余区间
for (let i = 1; i < intervals.length; i++) {
if (intervals[i][0] <= res[index][1]) {
// 区间重合 合并区间
res.splice(index, 1, [res[index][0], Math.max(res[index][1], intervals[i][1])])
} else {
// 区间未重合
res.push(intervals[i])
index++
}
}
return res
};
题目来源:力扣(LeetCode)