目录
题目:
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