题目

代码
思路是先对数组进行排序,以区间第一个数从小到大排。然后维护一个ans数组先放入第一个区间,后续遍历到的区间都要和ans数组里最后一个区间last作比较:
- 如果可以合并,修改last;
- 如果不能合并,当前区间直接加入res数组,成为下一个last;
javascript
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
intervals.sort((a, b) => a[0] - b[0])
const ans = [intervals[0]]
for (let i = 1; i < intervals.length; i++) {
const last = ans[ans.length - 1]
if (last[1] >= intervals[i][0]) {
last[1] = Math.max(last[1], intervals[i][1])
} else {
ans.push(intervals[i])
}
}
return ans
};
这里注意数组是引用数据类型,所以last并不是复制了一份最后一个区间的副本,而是**指向了 ans 数组中那个区间对象的内存地址,**因此不需要先pop再push。
时间复杂度为O(nlogn)。