LeetCode每日一题:3.3合并排序的数组(八十三)

合并排序的数组

一、LeetCode题解

瞧一瞧~
  • 博健的LeetCode题解:Gitbook版本传送门
  • 博健的LeetCode题解:CSDN传送门
  • 有趣的CSS:Gitbook传送门
  • 前端进阶笔记:Gitbook传送门

二、算法题

题目

给定两个排序后的数组 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
};

结果

LeetCode每日一题:3.3合并排序的数组(八十三)_第1张图片

解法二(双指针)

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

思路

  • 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
};

结果

LeetCode每日一题:3.3合并排序的数组(八十三)_第2张图片

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

思路

  • 直接将两数组合并+排序
  • 代码简洁明了,但不一定是面试官希望的

代码

var merge = function(A, m, B, n) {
    A.splice(m, n, ...B)
    A.sort((a, b) => a - b)
    return A
};

结果

LeetCode每日一题:3.3合并排序的数组(八十三)_第3张图片

你可能感兴趣的:(#,LeetCode题解系列)