力扣练习之合并两个有序数组

我爱海鲸 2022-09-22 15:01:41 暂无标签

简介初级算法、排序和搜索

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnumcr/

解法一:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] tmp = new int[m+n];
        int index = 0;
        int i = 0;
        int j = 0;
        while (i < m && j <n) {
            if (nums1[i] <= nums2[j]) {
                tmp[index++] = nums1[i++];
            } else {
                tmp[index++] = nums2[j++];
            }
        }
        while (i<m) {
            tmp[index++] = nums1[i++];
        }
        while (j<n) {
            tmp[index++] = nums2[j++];
        }
        for (int k =0 ; k < (m+n); k++) {
            nums1[k] = tmp[k];
        }
    }
}

思路:遍历数组,首先同时遍历数组,将数组中数值较小的元素放到了一个临时的数组中,当然这个临时的数组长度为两个有序数组长度的和,遍历的结束条件为其中有一个数组已经没有元素可以遍历了,这个时候,就只剩其中一个数组中有元素了 ,那么只要单独遍历那个数组,再添加到临时数组中即可,当然我们可以将两个数组单独遍历即可。最后两个数组的元素就已经合并到了这个临时数组中了,那么我们只需要将这临时数组重新赋值到第一个数组中即可。

解法二:

class Solution {
    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--];
        }
    }
}

思路:nums1有足够的空间容纳nums2,nums1和nums2是非递减数组,那么我们从后开始遍历比较大小就能够取出这两个数组中最大的元素。然后再赋值,比较的时候需要校验第一个数组和第二个数组是否还存在元素。所以循环的次数为m+n次,时间复杂度为O(n+m)。

解法三:

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

思路:将第二个数组复制到第一个数组中,然后整体排序即可。

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

Object src : 原数组;

int srcPos : 从元数据的起始位置开始;

Object dest : 目标数组;

int destPos : 目标数组的开始起始位置;

int length : 要copy的数组的长度。

你好:我的2025