【路飞】算法与数据结构-面试题 10.01. 合并排序的数组

80 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

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

示例 1:

输入:
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

思路

  • 由于两个数组的特殊性:两个数组都是排序后的数组。同时数组A有足够的缓冲空间。所以选择A存储排序后的数组。
  • 步骤:比较A[m-1]和B[n-1]的数,将较大的数保存在数组A的末尾,同时移动数组中的位置
  • 注意:A[m-- -1]记得建议,因为数组从0开始编号,数组的下标等于数组长度减1
/**
 * @param {number[]} A
 * @param {number} m
 * @param {number[]} B
 * @param {number} n
 * @return {void} Do not return anything, modify A in-place instead.
 */
var merge = function(A,m,B,n){
       while (m > 0 && n > 0) {
            // 对比选出较大的数放在 m + n - 1 的位置,并将选出此数的指针向前移动
            A[m + n - 1] = A[m - 1] > B[n - 1] ? A[m-- -1] : B[n-- - 1];
        }
        // 剩下的数都比已经遍历过的数小
        // 如果 m 不为 0,则 A 没遍历完,都已经在 A 中不用再管
        // 如果 n 不为 0,则 B 没遍历完,直接全移到 A 中相同的位置
        while (n > 0) {
            A[n - 1] = B[n - 1];
            n--;
        }
};