合并两个有序数组最优解:
时间复杂度:O(n)
空间复杂度:O(n)
// 正向
var mergeSortedArray = function(arr1, arr2) {
let m = 0;
let n = 0;
let news = [];
let len = arr1.length + arr2.length - 1;
let o = 0;
while(o < len) {
news[o++] = arr1[m] < arr2[n] ? arr1[m++] : arr2[n++];
}
while(m < arr1.length) {
news.push(arr1[m++])
}
while(n < arr2.length) {
news.push(arr2[n++])
}
return news
}
let arr = mergeSortedArray([2,3,5,6,9], [1,2,3,29]); // [1, 2, 2, 3, 3, 5, 6, 9, 29]
console.log(arr)
// 反向
var mergeSortedArray = function(arr1, arr2) {
let m = arr1.length - 1;
let n = arr2.length - 1;
let news = [];
let o = m + n + 1;
while(o >= 0) {
news[o--] = arr1[m] > arr2[n] ? arr1[m--] : arr2[n--];
}
return news
}
let arr = mergeSortedArray([2,3,5,6,9], [1,2,3,29]); // [1, 2, 2, 3, 5, 6, 9, 29]
console.log(arr)
接下来难度升级:
合并两个有序数据后再去重
时间复杂度:O(n)
空间复杂度:O(n)
// 反向
var mergeSortedArrayAndUnique = function(arr1, arr2) {
let m = arr1.length - 1;
let n = arr2.length - 1;
let news = [];
let o = m + n + 1;// 合并后的数组最大长度为arr1和arr2长度的和
while(o >= 0) {
// 过滤掉news中已经存在的值
if(arr1[m] == news[0]) {
m--;
o--;
continue;
}
if(arr2[n] == news[0]) {
n--;
o--;
continue;
}
if(arr1[m] > arr2[n]) {
news.unshift(arr1[m--]);
} else if (arr1[m] == arr2[n]) {
news.unshift(arr1[m]);
m--;
n--;
o--;
} else {
news.unshift(arr2[n--]);
}
o--;
}
return news
}
let arr = mergeSortedArrayAndUnique([2,2,3,5,6,9], [1,2,3,29]);
// [1, 2, 3, 5, 6, 9, 29]
console.log(arr);
最后,如果感兴趣的同学,可以试着写写合并两个有序数据后再去重的正向解题。