给定两个有序数组,ary 和 ary2,
其中 ary 的数组长度为 m + n , 其中前m 是要合并的数组,剩余的是 0; ary2的数组长度为 n;
换句话说,数组 ary 长度 为 m+n,但是有用的 只有 前 m 项,剩余的 n 项 是 0,是需要 ary2 来补上的
example:
let ary = [1, 2, 3, 0,0,0];
let m = 3;
let ary2 = [2,5,6];
let n = 3;
合并后的数组:[1,2,2,3,5,6]
题解1 (暴力解法)
简单的合并数组,然后进行数组的排序,并未利用题中的 有序
function sort(ary, m, ary2, n) {
for (let i = 0; i < n; i++){
ary[m+i] = ary2[i]
}
ary.sort((a,b)=>a-b)
}
题解2(双指针)
// 创建了一个临时数组,但是 并未用到题目中所描述的 ary 的长度是 m + n
没有 利用到为 0的剩余空间
function sort(ary, m, ary2, n) {
let a1 = 0,
a2 = 0,
temp = [];
for (let i = 0; i < ary.length - 1; i++) {
// 比较下标
if (a2 > n) {
// temp[index] = ary[a1++]; 两种写法
temp.push(ary[a1++]);
} else if (a1 > m) {
temp.push(ary2[a2++]);
} else if (ary[a1] > ary2[a2]) {
temp.push(ary2[a2++]);
} else {
temp.push(ary[a1++]);
}
}
for (let i = 0; i < ary.length - 1; i++) {
ary[i] = temp[i];
}
}
3.充分利用 排序(双指针)
// m+n 其实就是整个ary数组的长度
// 从后 往前 遍历,
// 如果 ary1 的最后一位小于 ary2 的最后一位,就把 ary 的最后一位 制成 ary2
// 如果大于 就把这一项 制成 ary1
// 由于 ary2 的长度小于 ary1 的长度,如果 ary的 index 变成 0,可以直接 break
// ary1 的 index 小于 0的时候,ary的 index 只能是 ary2
function sort(ary, m, ary2, n) {
let k = m + n;
for (
let index = k - 1, nums1Index = m - 1, nums2Index = n - 1;
index > 0;
index--
) {
if (nums1Index < 0) {
ary[index] = ary2[nums2Index--];
} else if (nums2Index < 0) {
break;
} else if (ary[nums1Index] > ary2[nums2Index]) {
// 也就是下图中的 3 和 0,她两交换位置
// 然后 nums1Index 指向了 原来是 3现在是 0的这个位置
ary[index] = ary[nums1Index--];
} else {
ary[index] = ary2[nums2Index--];
}
}
}