LeetCode第88题merge的三种思路

目录

  • arrayCopy方法介绍
  • 代码最少的方法
  • 二路归并排序
  • 最好的方法:双指针从后往前

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--];
            }
        }
    }
}

你可能感兴趣的:(LeetCode,算法,指针,数据结构,leetcode,java)