合并排序的数组

一、LeetCode题解

瞧一瞧~

二、算法题

题目

给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。

初始化 A 和 B 的元素数量分别为 m 和 n。

示例:

输入:
A = [1,2,3,0,0,0], m = 3
B = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]
说明:

A.length == n + m

解法一(直接合并排序)

  • 按常规思路,将B数组放入A数组后排序
  • 时间复杂度:O((m+n)log(m+n))
  • 空间复杂度:O(log(m+n))
代码
var merge = function(A, m, B, n) {
    let j = 0
    for(let i = m; i < m + n; i++){
        A[i] = B[j++]
    }
    A = A.sort((a, b)=>{
        return a-b;
    })
    return A
};
结果

在这里插入图片描述

解法二(双指针)

注意审题,给我们两组已经排序的数组,我们要利用上

思路
  • a指针记录A数组元素位置,b指针记录B数组元素位置
  • 如果a数组元素符合要求,则a指针左移,反之则b指针左移
代码
var merge = function(A, m, B, n) {
    var a = 0, b = 0;
    var arr = []
    while(a < m || b < n){
        if(a === m){
            arr.push(B[b++])
        }else if(b === n){
            arr.push(A[a++])
        }else if(A[a] < B[b]){
            arr.push(A[a++])
        }else{
            arr.push(B[b++])
        }
    }
    for (let i = 0;i < m+n; i++) {
        A[i] = arr[i]
    }
    return A
};
结果

在这里插入图片描述

解法三(数组方法+排序)

思路
  • 直接将两数组合并+排序
  • 代码简洁明了,但不一定是面试官希望的
代码
var merge = function(A, m, B, n) {
    A.splice(m, n, ...B)
    A.sort((a, b) => a - b)
    return A
};
结果

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐