美文网首页
LeetCode 每日一题 [5] 合并排序的数组

LeetCode 每日一题 [5] 合并排序的数组

作者: 是小猪童鞋啦 | 来源:发表于2020-05-23 07:04 被阅读0次
    LeetCode 面试题 10.01. 合并排序的数组 [简单]

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

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

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

    示例:

    输入:
    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
    题目分析
    方法1:

    直接追加到末尾,然后排序 不过给的方法没有用到n,我就发现了不寻常之处

    方法2:

    需要比较 m + n 个数的大小,所以先保证其中至少 m 或 n 个数比较完毕并放在正确位置,再考虑剩下的数。
    注意 m 和 n 是未遍历的、有效的数字的个数,不是下标,作为下标要 -1−1 。

    核心思想是为了防止前面的数据被覆盖。而且数据是从后面向前面添加,也就是比较
    A数组的有效值部分和B数组的最后一个,取大的哪个数据放在最后面,
    如果B有剩下的数据,那么就说明,A已经派完了,而B剩余的数据有序,就直接放到A对应位置即可

    方法3:

    3.1 先把A的有效数据移动到最后面
    3.2 然后把A和B的有效数据进行比较,小的放在前面。然后指向索引的值变化,直到有结束,然后如果m或者n还是有值,就直接CV一下,结束

    代码实现
    public class LeetCode_05_SortedMergeLCCI {
        public static void main(String[] args) {
            int[] A = {1, 2, 3, 0, 0, 0};
            int[] B = {2, 5, 6};
            int m = 3, n = 3;
            merge03(A, m, B, n);
            for (int num : A) {
                System.out.print(num + " ");
            }
        }
    
        /**
         * 思想是把A的数据拿到后面去,然后比较填充前面的数据
         */
        public static void merge03(int[] A, int m, int[] B, int n) {
            System.arraycopy(A, 0, A, n, m);
            int index = 0;
            int indexA, indexB;
            for (indexA = n, indexB = 0; indexA < m + n && indexB < n; ) {
                if (A[indexA] <= B[indexB]) {
                    A[index++] = A[indexA++];
                } else {
                    A[index++] = B[indexB++];
                }
            }
            while (indexB < n) {
                A[index++] = B[indexB++];
            }
        }
    
        /**
         * 需要比较 m + n 个数的大小,所以先保证其中至少 m 或 n 个数比较完毕并放在正确位置,再考虑剩下的数。
         * 注意 m 和 n 是未遍历的、有效的数字的个数,不是下标,作为下标要 -1−1 。
         * <p>
         * 核心思想是为了防止前面的数据被覆盖。而且数据是从后面向前面添加,也就是比较
         * A数组的有效值部分和B数组的最后一个,取大的哪个数据放在最后面,
         * 如果B有剩下的数据,那么就说明,A已经派完了,而B剩余的数据有序,就直接放到A对应位置即可
         */
        public static void merge02(int[] A, int m, int[] B, int n) {
            while (m > 0 && n > 0) {
                A[m + n - 1] = A[m - 1] > B[n - 1] ? A[--m] : B[--n];
            }
            while (n > 0) {
                A[n - 1] = B[n - 1];
                n--;
            }
        }
    
        /**
         * 直接追加到末尾,然后排序 不过给的方法没有用到n,我就发现了不寻常之处
         */
        public static void merge(int[] A, int m, int[] B, int n) {
            int targetIndex = 0;
            for (int i = m; i < A.length; i++) {
                A[i] = B[targetIndex];
                targetIndex++;
            }
            Arrays.sort(A);
        }
    }
    

    相关文章

      网友评论

          本文标题:LeetCode 每日一题 [5] 合并排序的数组

          本文链接:https://www.haomeiwen.com/subject/uasbihtx.html