2021-07-07 合并俩个有序数组

如标题,给定俩个升序数组,要求合并为一个升序数组,最小复杂度

[1,3,6] [2,7,8] 合并后为[1,2,3,6,7,8]

方案一:
// 借用Array原生方法
const concat = (a1, a2) => a1.concat(a2).sort((a, b)=> a-b);
let arr1 = [1,3,6],
    arr2 = [2,7,8];
console.log(concat(arr1, arr2));

等等,原数组是有序的,这样粗暴的合并后排序是不是浪费了,换个思路

方案二:
// 思考有序的概念
// 将arr2作为队列,每次取出队首数据,插入arr1中,记录插入位置
// 若某次插入到arr1末尾,则可判定arr2中剩余数均大于arr1的队尾
function concat(a1, a2) {
    if(!Array.isArray(a1) || !Array.isArray(a2)) {
        throw new Error('must be Array!');
    }
    let j = 0;
    const getIndex = (start, val) => {
        let l = a1.length;
        if(a1[l-1] <= val) return l;
        for(let i = start; i < l; i++) {
            if(val >= a1[i]) {
                start = i;
            } else {
                break;
            }
        }
        return start;
    }
    while(a2.length) {
        let val = a2.shift();
        let index = getIndex(j, val);
        if(index == a1.length) {
            a1 = a1.concat([val], a2);
            a2 = [];
        } else {
            a1.splice(index+1, 0, val);
        }
        j = index;
    }

    return a1;
}

你可能感兴趣的:(2021-07-07 合并俩个有序数组)