LeetCode 88:合并两个有序数组

90 阅读1分钟

给定两个有序数组,aryary2, 其中 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--];
          }
        }
      }

image.png