题目
代码
思路是先对数组进行排序,以区间第一个数从小到大排。然后维护一个ans数组先放入第一个区间,后续遍历到的区间都要和ans数组里最后一个区间last作比较:
- 如果可以合并,修改last;
- 如果不能合并,当前区间直接加入res数组,成为下一个last;
/** * @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)。