双指针 - 归并两个有序数组

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双指针 - 归并两个有序数组相关的知识,希望对你有一定的参考价值。

双指针 - 归并两个有序数组

题目地址:88. Merge Sorted Array (Easy)

题目如下:

You are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m m m and n n n, representing the number of elements in nums1 and nums2 respectively.

Merge nums1 and nums2 into a single array sorted in non-decreasing order.

The final sorted array should not be returned by the function, but instead be stored inside the array nums1. To accommodate this, nums1 has a length of m + n m + n m+n, where the first m m m elements denote the elements that should be merged, and the last n n n elements are set to 0 0 0 and should be ignored. nums2 has a length of n n n.

解题思路:

日常先开始捋题,这道题还挺长的,加粗或是加斜的地方挺多的,这也代表着标记的重点挺多的。

  1. 有两个数组,并且两个数组中整数存储的方式是非降序

    非降序不代表升序,这只代表着当前数字 ≤ \\leq 下一个数字

  2. 分别存在两个整数 m m m n n n,用于存储两个数组中分别有多少数字

    nums1nums2 真正的长度

  3. 需要合并两个数组,并且保持 非降序 顺序

  4. 不能将两个数组中的数值存入新的数组中,必须要将所有的值存入第一个数组中,也就是 nums1

  5. nums1 保证长度够长

    nums1 会有空值(0)

  6. 按照提示,依旧是用双指针(这题还是在双指针的范围内的)

    所以先指定两个指针,分别对应两个数组的长度-1。

    已知两个数组中整数存储的方式是非降序的,这就能够保证 n u m s 1 [ m − 1 ] nums1[m-1] nums1[m1] n u m s 2 [ n − 1 ] nums2[n-1] nums2[n1] 的值一定是对应数组中最大的。

    因此可以比对二者的值,然后插入到 nums1 的空插槽处。

根据解题思路解题:

/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function (nums1, m, nums2, n) {
  let num1Index = m - 1,
    num2Index = n - 1,
    totalIndex = nums1.length - 1;

  // 只需要判断 num2Index ≥ 0,因为是将 nums2 的值移到 nums1 中去
  // 所以只要 nums2 移完了,nums1 就算维持原样也是满足题目要求的
  while (num2Index >= 0) {
    if (nums1[num1Index] >= nums2[num2Index])
      nums1[totalIndex--] = nums1[num1Index--];
    else nums1[totalIndex--] = nums2[num2Index--];
  }

  // 输出测试
  console.log(nums1);
};

// 题目中给出的3个案例
merge((nums1 = [1, 2, 3, 0, 0, 0]), (m = 3), (nums2 = [2, 5, 6]), (n = 3)); // [ 1, 2, 2, 3, 5, 6 ]
merge((nums1 = [1]), (m = 1), (nums2 = []), (n = 0)); // [ 1 ]
merge((nums1 = [0]), (m = 0), (nums2 = [1]), (n = 1)); // [ 1 ]

以上是关于双指针 - 归并两个有序数组的主要内容,如果未能解决你的问题,请参考以下文章

算法学习归并排序

归并排序

[leetcode 88. 合并两个有序数组] 尾部归并O空间,最好O(n)最坏O(m+n),双100%

双指针2合并两个有序数组

双指针2合并两个有序数组

LeetCode88. 合并两个有序数组