【LeeCode】面试题 10.01. 合并排序的数组

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sorted-merge-lcci

题目描述:

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

算法一:将B依次取出插到A中

1 ms 38 MB

class Solution {
    public void merge(int[] A, int m, int[] B, int n) {
        int tmp;// 存储B中取出的元素的数值
        int len = m - 1;// 记录A中最后一个元素的序号
        for (int i = 0; i < n; i++) {
            tmp = B[i];// 存储每一个从B中取出来的元素
            int comNum = len;// 记录被比较的元素的序号
            while (comNum >= 0 && A[comNum] > tmp) {// 找到小于等于tmp的那个元素的下标
                A[comNum + 1] = A[comNum];
                comNum--;
            }
            A[comNum + 1] = tmp;// 成功将B中的元素插入到了A中应该在的位置上
            len++;// A的元素数加一
        }
    }
}

算法二:将两个指针放在AB的最后,将大的放到A的最最后

0 ms 38.3 MB

class Solution {
    public void merge(int[] A, int m, int[] B, int n) {
        int i = m -1;
        int j = n -1;
        int flag = m+n-1;
        while(i >= 0 || j >=0){
            if(i>=0 && (j==-1 ||A[i]>=B[j])){
                A[flag] = A[i];
                i--;
            }else{
                A[flag]=B[j];
                j--;
            }
            flag --;
        }
    }
}

你可能感兴趣的:(算法)