https://leetcode-cn.com/problems/merge-sorted-array/
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
示例:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
方法一:合并后,七大排序
这个方法有点生硬,我将nums2数组拷贝到nums1后面,然后得到一个无顺序的数组,这个时候我们学过的七大排序就派上用场了,这里我采用插入排序为例子
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (n == 0){
return;
}
for (int i = 0; i < nums2.length; i++) {
nums1[m + i] = nums2[i];
}
insertSort(nums1,m + n);
}
public void insertSort(int[] array,int length){
//这是插入排序
for (int bound = 1; bound < length; bound++) {
int tmp = array[bound];
int cur = bound - 1;
for(;cur >=0;cur--){
if (array[cur] > tmp){
array[cur + 1] = array[cur];
}else {
break;
}
}
array[cur + 1] = tmp;
}
}
}
时间复杂度:O(N^2)
空间复杂度:O(1)
我写过的关于七大排序的博客:https://blog.youkuaiyun.com/question_mark/article/details/103045910
方法二:合并后排序
看到了力扣的官方解答,这也太简洁了吧
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array.
意思是,将src数组拷贝到dest目标数组,从0(srcPos)开始拷贝,拷贝到目标数组从m(destPos)开始拷贝,拷n这么长
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2,0,nums1,m,n);
Arrays.sort(nums1);//排序
}
时间复杂度 : O((n+m)log(n+m))。
空间复杂度 : O(1)。
方法三:双指针法
这个方法有点类似合并两个有序链表
https://blog.youkuaiyun.com/question_mark/article/details/102285426
也是用两个指针,一个指向nums1(Copy),一个指向nums2,比较大小然后放入nums1中
具体实现代码如下:
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums1Copy = new int[m];
//将nums1新拷贝一份
System.arraycopy(nums1,0,nums1Copy,0,m);
//两个指针,一个指向nums1Copy,一个指向nums2
int p1 = 0;
int p2 = 0;
int p = 0;//指向nums1最终要输出的
while ((p1 < m) && (p2 < n)){
nums1[p++] = (nums1Copy[p1] < nums2[p2])? nums1Copy[p1++] : nums2[p2++];
}
if (p1 < m)
System.arraycopy(nums1Copy, p1, nums1, p, m - p1);
if (p2 < n)
System.arraycopy(nums2, p2, nums1, p ,n - p2);
}