88. 合并两个有序数组(java实现)--LeetCode

目录

题目: 

解法1:暴力

解法2:双指针(新建数组)

解法3:双指针(不新建数组)


题目: 

https://leetcode-cn.com/problems/merge-sorted-array/

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出:[1,2,2,3,5,6]

提示:

  • -10^9 <= nums1[i], nums2[i] <= 10^9
  • nums1.length == m + n
  • nums2.length == n

解法1:暴力

/**
 * 思路:
 * 把nums2的元素放入后用Arrays的sort方法排序
 */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int index=0;
        for (int i=m;m<nums1.length;m++){
            nums1[m]=nums2[index++];
        }
        Arrays.sort(nums1);
    }

时间复杂度:Onlogn

空间复杂度:O1

解法2:双指针(新建数组)

/**
 * 思路:
 * 把nums1前m个元素放入新数组nums1_copy
 * 比较nums1_copy和nums2的元素,小的放入nums1
 * 如果nums1_copy的元素用完,就把nums2的元素全拷贝到nums1的剩余位置中。反之亦然
 */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int nums1_copy[]=new int[m];
        System.arraycopy(nums1,0,nums1_copy,0,m);
        int i=0,j=0;
        for (int index=0;index<nums1.length;index++){
            if (i==m) {
                System.arraycopy(nums2, j, nums1, index, n - j);
                break;
            }
            else if (j==n) {
                System.arraycopy(nums1_copy, i, nums1, index, m - i);
                break;
            }
            else if (nums1_copy[i]<nums2[j])nums1[index]=nums1_copy[i++];
            else if (nums1_copy[i]>nums2[j])nums1[index]=nums2[j++];
        }
    }

时间复杂度:On

空间复杂度:On

 

解法3:双指针(不新建数组)

/**
 * 思路:
 * 从后往前
 * 利用2个数组都排好序的条件,从nums1的m开始往前遍历,从nums2的n开始往前遍历
 * 比较两个元素,谁大放到nums1的末尾
 * 如果nums2用完,直接结束,nums1就排好序了
 * 如果nums1用完,需要将nums2的元素全放入剩余的位置中
 */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        m--;
        n--;
        for (int index = nums1.length - 1; index >= 0; index--) {
            if (m < 0) nums1[index] = nums2[n--];
            else if (n < 0) break;
            else if (nums1[m] > nums2[n]) {
                nums1[index] = nums1[m--];
            } else {
                nums1[index] = nums2[n--];
            }
        }
    }

时间复杂度:On

空间复杂度:O1

猜你喜欢

转载自blog.csdn.net/qq_38783664/article/details/110388857