题解 | #合并两个有序的数组#

合并两个有序的数组

https://www.nowcoder.com/practice/89865d4375634fc484f3a24b7fe65665

双指针思想

双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而达到我们需要的目的。

如何将两个有序的数组融合到第一个有序的数组中?

  • 由于题目中A已经扩容到可以容纳两个数组元素的容量了,多于的元素用了0作为占位符,所以在融合数组时,应该使用下标进行赋值替换操作,而不是用push来进行插入操作,因此需要第三个指针操作最终A数组的下标。
  • 由于要替换扩容后的A中的后面为0的占位符,所以元素比较应该从最后一个元素开始,因此初始的A和B的指针应该指向两者最后一个元素,依次遍历将较大的元素替换A中后面的元素。
  • 由于最后融合在A中,因此如果最后剩下A中的元素没有遍历完,它已经在A中有序了,无需继续遍历替换,但是如果B中还有元素,还应继续进行遍历替换操作将他们给替换掉。

参考

https://blog.nowcoder.net/n/374f83439d7c4541bf858642c29c144a?f=comment

https://blog.nowcoder.net/n/e6a478783bde4322ab489fc1ba3e6cdb?f=comment

/**
 * 
 * @param A int整型一维数组 
 * @param B int整型一维数组 
 * @return void
 */
function merge( A, m, B, n ) {
    // write code here
    // A和B都是有序的,从这两个数组的最后一个元素开始遍历,将两者中最大的元素依次放到A的末尾
    let i = n-1;
    let j = m-1;
    let k = n+m-1;  // 为了能直接将元素放入A中,而不用临时数组,需要第三个指针
    
    while (i >= 0 && j >= 0) {
        if (A[j] >= B[i]) {
            A[k--] = A[j--];
        }
        else {
            A[k--] = B[i--];
        }
    }

    while (i >= 0) {
        A[k--] = B[i--];  // 如果B中还有元素则继续放入A中,如果A中还有元素则剩下的元素已经在最终的A中有序了。
    }
}
module.exports = {
    merge : merge
};

全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳  yidao,试用期 6 个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务