如标题,给定俩个升序数组,要求合并为一个升序数组,最小复杂度
[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;
}
网友评论