function merge(intervals: number[][]): number[][] {
// 为防止sort修改原数组,此处浅拷贝后排序
const newIntervals = intervals.length > 1 ? [...intervals].sort((a, b) => a[0] - b[0]): [...intervals];
// 如果0或1个不用判定
if (intervals.length < 2) {
return newIntervals;
}
const result: typeof intervals = [];
newIntervals
.forEach(item => {
// result第一项直接添加
if (!result.length) {
result.push(item);
} else {
// 解构出各项然后开始下面的比较逻辑
const [lastItemFirstNum, lastItemSecondNum] = result[result.length - 1];
const [curFirstNum, curSecondNum] = item;
// 新首值和新末值,然后开始比较逻辑
let [newFirst, newSecond] = item;
// result中当前最后一项是否被改变
let willPop = false;
// [1, 5] [3, 6],比较result最后一项与item第一项大小,
// 满足条件修改newFirst
if (curFirstNum <= lastItemSecondNum) {
newFirst = lastItemFirstNum;
willPop = true;
}
// 比较item最后一项 与 result最后一项大小,满足条件修改newFirst
if (lastItemSecondNum > curSecondNum) {
newSecond = lastItemSecondNum;
willPop = true;
}
// 上两项满足一项即改变result最后一项,否则直接将item push进去
if (willPop) {
result.pop();
}
result.push([newFirst, newSecond]);
}
});
return result;
};