合并两个有序数组(88. 合并两个有序数组)

题目:

思路:

【1】这种如果简单点的就是可以利用JDK的API来快速完成

【2】其实并没有什么进阶不进阶的,了解过归并算法的,其实便可以参考,新开辟一个足够存储的空间,然后按照指针指向分别从两个数组中拿出数据塞入新开辟的空间,这种其实就满足了遍历完两个数组的长度,也就是符合时间复杂度O(M+N)

【3】那么基于归并算法的话,有根据题意,其实nums1其实是有足够的的空间的,而且后面那部分的数据【默认是nums2大小的数组空间】其实可以认为是null,那么归并的话其实可以从后往前,依然是两个下标,这样就可以节省掉【2】里面开辟的新空间

代码展示:

利用官方API:

public void merge(int[] nums1, int m, int[] nums2, int n) {
    System.arraycopy(nums2, 0, nums1, m, n);
    Arrays.sort(nums1);
}

参考归并算法:

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int temp[] = new int[m + n];
    int index = 0;
    int i = 0;
    int j = 0;
    while (i < m && j < n) {
        if (nums1[i] <= nums2[j])
            temp[index++] = nums1[i++];
        else
            temp[index++] = nums2[j++];
    }
    for (; i < m; ) {
        temp[index++] = nums1[i++];
    }
    for (; j < n; ) {
        temp[index++] = nums2[j++];
    }
    //再把数组temp中的值赋给nums1
    for (int k = 0; k < m + n; k++) {
        nums1[k] = temp[k];
    }
}

基于题意对归并算法的优化:

public void merge(int[] nums1, int m, int[] nums2, int n) {
    int i = m - 1;
    int j = n - 1;
    int end = m + n - 1;
    while (j >= 0) {
        nums1[end--] = (i >= 0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
    }
}

 

posted @ 2023-01-04 15:02  忧愁的chafry  阅读(16)  评论(0编辑  收藏  举报