LeetCode第88题merge的三种思路

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--];
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值