【刷题打卡】双指针-合并两个有序数组

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、题目描述

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

样例:

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

二、解题思路

先看题目要求:

  1. nums1的数组初始并不是全都是nums1的值,而是为nums2的元素保留了空间
  2. 本题在遇到nums1和nums2都有的元素时,nums1的元素在前
  3. 本题没有返回值,最终的结果保留在nums1中

题目要求中nums1刚好为nums2留了位置,我们可以采用双指针法:p1指针指向nums1的第m个元素,p2指向nums2的第n个元素,比较之后取较大的元素放到nums1的末尾,然后移动指针;再进行比较,再取值放到nums1末尾,再移动指针……这样不会产生有值被覆盖的问题。

但是还有这样的特殊情况需要我们考虑:
如果nums1中没有真实元素呢?那我们根据指针从两个数组中取值比较时nums1[m-1],就会取不到值,因为m的值为0.针对这种情况,我们可以单独设置一个条件判断,当m===0时,取nums2中的值到nums1中。
如果nums2中没有真实元素呢?nums2[n-1]也取不到值,这时候我们怎么处理呢?

AC代码

var merge = function(nums1, m, nums2, n) {
    // 双指针法 
    // if (m === 0 || n === 0) {
    //     // 没有第二个参数,会默认取到末尾
    //     nums1 = (m === 0) ? nums1.concat(nums2).slice(1) : nums1.concat(nums2)
    // }
    //初始化两个指针
    let p1 = m - 1
    let p2 = n - 1
    //从nums1的最后一个位置开始
    for (let i = m + n - 1; i >= 0; i--) {
        if(p1===-1){
            //无需比较,直接把nums2中对应的值放到nums1中
             nums1[i]=nums2[p2]
             p2--
        }
        else if(p2===-1){
            //无需比较,直接把nums1中对应的值拿过来(其实位置没有变,但是是为了避免取不到值)
            nums1[i]=nums1[p1]
            p1--
        }
        else if (nums1[p1] >= nums2[p2]) {
            nums1[i] = nums1[p1]
            p1--
        } else if (nums1[p1] < nums2[p2]) {
            nums1[i] = nums2[p2]
            p2--
        }
    }
};
复制代码

四、总结

这个题总的来说不难,需要细心、认真。

Supongo que te gusta

Origin juejin.im/post/7077512605039853581
Recomendado
Clasificación