大厂面试手撕面试题:合并两个有序数组(亲测可用的java实现)

在面试中,如果遇到要求合并两个有序数组的问题,可以通过以下步骤来实现:

思路:

  1. 双指针法:我们使用两个指针分别指向两个数组的起始位置。
  2. 比较大小:每次比较两个数组当前指针指向的元素,将较小的元素加入到结果数组中,并移动对应的指针。
  3. 处理剩余元素:当其中一个数组的所有元素都被合并到结果数组中时,另一个数组剩余的元素直接追加到结果数组中。

关键点:

  • 如果两个数组的长度分别为 n 和 m,那么合并的时间复杂度是 O(n + m),因为每个元素只会被处理一次。
  • 空间复杂度是 O(n + m),因为我们需要一个新的数组来存储结果。

时间复杂度:

  • 时间复杂度O(n + m),其中 n 和 m 分别是两个数组的长度。我们需要遍历两个数组的每个元素一次。

空间复杂度:

  • 空间复杂度O(n + m),因为我们需要一个新的数组来存储合并后的结果。

Java代码实现:

public class MergeSortedArrays {
    
    // 合并两个有序数组
    public static int[] merge(int[] arr1, int[] arr2) {
        // 创建一个新数组,大小为两个数组之和
        int n = arr1.length;
        int m = arr2.length;
        int[] result = new int[n + m];
        
        int i = 0, j = 0, k = 0;
        
        // 合并两个数组,直到有一个数组遍历完
        while (i < n && j < m) {
            if (arr1[i] <= arr2[j]) {
                result[k++] = arr1[i++];
            } else {
                result[k++] = arr2[j++];
            }
        }
        
        // 将剩余元素添加到结果数组中
        while (i < n) {
            result[k++] = arr1[i++];
        }
        while (j < m) {
            result[k++] = arr2[j++];
        }
        
        return result;
    }

    public static void main(String[] args) {
        int[] arr1 = {1, 3, 5, 7};
        int[] arr2 = {2, 4, 6, 8};
        
        int[] mergedArray = merge(arr1, arr2);
        
        // 打印合并后的数组
        System.out.print("Merged array: ");
        for (int num : mergedArray) {
            System.out.print(num + " ");
        }
    }
}

解释:

  • 我们通过 merge 方法来合并两个有序数组 arr1 和 arr2
  • 使用三个指针 ijk
    • i 用来遍历 arr1
    • j 用来遍历 arr2
    • k 用来填充合并结果数组 result
  • 每次比较 arr1[i] 和 arr2[j],将较小的元素放入 result[k] 中,移动对应的指针。直到其中一个数组遍历完。
  • 剩余未遍历完的数组直接复制到结果数组的末尾。

输出:

Merged array: 1 2 3 4 5 6 7 8

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注