双指针 - 归并两个有序数组
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双指针 - 归并两个有序数组相关的知识,希望对你有一定的参考价值。
双指针 - 归并两个有序数组
题目地址:88. Merge Sorted Array (Easy)
题目如下:
You are given two integer arrays
nums1
andnums2
, sorted in non-decreasing order, and two integers m m m and n n n, representing the number of elements innums1
andnums2
respectively.Merge
nums1
andnums2
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.
解题思路:
日常先开始捋题,这道题还挺长的,加粗或是加斜的地方挺多的,这也代表着标记的重点挺多的。
-
有两个数组,并且两个数组中整数存储的方式是非降序
非降序不代表升序,这只代表着当前数字 ≤ \\leq ≤ 下一个数字
-
分别存在两个整数 m m m 和 n n n,用于存储两个数组中分别有多少数字
即
nums1
和nums2
真正的长度 -
需要合并两个数组,并且保持 非降序 顺序
-
不能将两个数组中的数值存入新的数组中,必须要将所有的值存入第一个数组中,也就是
nums1
-
nums1
保证长度够长即
nums1
会有空值(0) -
按照提示,依旧是用双指针(这题还是在双指针的范围内的)
所以先指定两个指针,分别对应两个数组的长度-1。
已知两个数组中整数存储的方式是非降序的,这就能够保证 n u m s 1 [ m − 1 ] nums1[m-1] nums1[m−1] 与 n u m s 2 [ n − 1 ] nums2[n-1] nums2[n−1] 的值一定是对应数组中最大的。
因此可以比对二者的值,然后插入到
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 ]
以上是关于双指针 - 归并两个有序数组的主要内容,如果未能解决你的问题,请参考以下文章