arrayCopy方法介绍
System.arraycopy的函数原型是:public static void arraycopy(Object src,int srcPos,Object dest,int destPos, int length)
其中:src表示源数组,srcPos表示源数组要复制的起始位置,desc表示目标数组,length表示要复制的长度。
代码最少的方法
最朴素的解法就是将两个数组合并之后再排序。该算法Java只需要2行,但时间复杂度较差。这是由于这种方法没有利用两个数组本身已经有序这一点。
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
二路归并排序
主要是二路归并思想,建立一个新数组nums3,最后nums1=nums3
虽然比较笨而且需要一定的空间复杂度 但是速度还是比较快的
执行用时:0 ms, 在所有 Java 提交中击败了100.00%
class Solution {
public void merge(int[]nums1,int m,int[] nums2,int n){
int[] nums3=new int[m+n];
int i = 0,j = 0,k = 0;
while (i < m && j < n){
if (nums1[i]>nums2[j]){
nums3[k++]=nums2[j++];
}else{
nums3[k++]=nums1[i++];
}
}
while ( i < m ){
nums3[k++]=nums1[i++];
}
while ( j < n){
nums3[k++]=nums2[j++];
}
for(int x = 0;x < m + n;x++){
nums1[x]=nums3[x];
}
}
}
最好的方法:双指针从后往前
时间复杂度和空间复杂度都低
三指针 指针一p1、nums1有效元素尾部;指针二p2、nums2尾部;指针三p3、最终数组尾部
1.当,p1>=0时,nums[p1],nums[p2]对比
1.1 nums[p1]大,将nums[p1]放入p3位置。p1–,p3–
1.2 nums[p2]大于等于nums[p1],将nums[p2]放入p3位置。p2–,p3–
2.当,p1<0时,将nums[p2]放入p3位置。p2–,p3–
循环结束条件:p2<0
class Solution{
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1=m-1,p2=n-1,p3=m+n-1;
while(p2 >= 0){
if(p1 >= 0 && nums1[p1] > nums2[p2]){
nums1[p3--] = nums1[p1--];
} else {
nums1[p3--] = nums2[p2--];
}
}
}
}