[leetcode] 56 Merge Intervals

24 阅读1分钟
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;
};