算法刷题——合并两个有序数组

算法刷题——合并两个有序数组_第1张图片

力扣

方法一:默认排序算法 合并后sort 排序

首先我们可以用java自带的排序算法来实现

import java.util.Arrays;

public class ArrayMerge {
    public static void main(String[] args) {
        int[] ns=new int[]{1,2,3,0,0,0};
        int n=3;
        int[] ms=new int[]{2,5,6};
        int m=3;
        //        merge(nums,3,ms,3);
        for (int i = 0; i < m; i++) {
            ns[n+i]=ms[i];
        }
        Arrays.sort(ns);
        for (int i = 0; i < ns.length; i++) {
            System.out.println(ns[i]);
        }
    }
}

方法二:双指针判断大小排序

算法刷题——合并两个有序数组_第2张图片

 算法刷题——合并两个有序数组_第3张图片

通过比较 两个数组同一位置的元素 如果元素小则放到新的数组当中,在比较 大的数组中的下一位直到比较完成指定数量

import java.util.Arrays;

public class ArrayMerge {
    public static void main(String[] args) {
        int[] ns=new int[]{1,2,3,0,0,0};
        int n=3;
        int[] ms=new int[]{2,5,6};
        int m=3;
        merge(ns,3,ms,3);
//        for (int i = 0; i < m; i++) {
//            ns[n+i]=ms[i];
//        }
//        Arrays.sort(ns);
//        for (int i = 0; i < ns.length; i++) {
//            System.out.println(ns[i]);
//        }
    }
    public static void merge(int[]ns,int n,int[]ms,int m){
        int k=m+n;
        int[] temp=new int[k];
        for (int i = 0,nIndex=0,mIndex=0; i < k; i++) {
            System.out.println(nIndex+""+mIndex);
            //当前m 索引是否超出m的有效个数 如果超过则放入ns
            if(mIndex>=m){
                temp[i]=ns[nIndex++];
            }else if(nIndex>=n){
                temp[i]=ms[mIndex++];
            }//如果 ns ms 则放入 ms[mIndex]
            else
            {
                temp[i]=ms[mIndex++];
            }
        }
        for (int i = 0; i < temp.length; i++) {
            ns[i]=temp[i];
        }
        for (int i = 0; i < temp.length; i++) {
            System.out.println(temp[i]);
        }
    }
}

算法刷题——合并两个有序数组_第4张图片

 此时 时间复杂度 为 O(m+n)

方法二:

直接放到A数组中这样能少占用空间

算法刷题——合并两个有序数组_第5张图片

    public static void merge1(int[]ns,int n,int[]ms,int m){
        int k=m+n;
        for(int i=k-1,nIndex=n-1,mIndex=m-1;i>=0;i--){
            if(nIndex<0){
                ns[i]=ms[mIndex--];
            }else if(mIndex<0){
                break;
            }else if(ns[nIndex]>ms[mIndex]){
                ns[i]=ns[nIndex--];
            }else{
               ns[i]=ms[mIndex--];
            }
        }
        for (int i = 0; i < ns.length; i++) {
            System.out.println(ns[i]);
        }
    }

所有代码:

import java.util.Arrays;

public class ArrayMerge {
    public static void main(String[] args) {
        int[] ns=new int[]{1,2,3,0,0,0};
        int n=3;
        int[] ms=new int[]{2,5,6};
        int m=3;
//        System.out.println("----------------default---------------------");
//        defaultMerge(ns,n,ms,m);
//        System.out.println("----------------双指针方法1---------------------");
//        merge(ns,3,ms,3);
        System.out.println("----------------双指针方法2---------------------");
        merge1(ns,n,ms,m);
    }
    public static void defaultMerge(int[]ns,int n,int[]ms,int m){
        for (int i = 0; i < m; i++) {
            ns[n+i]=ms[i];
        }
        Arrays.sort(ns);
        for (int i = 0; i < ns.length; i++) {
            System.out.println(ns[i]);
        }
    }
    public static void merge(int[]ns,int n,int[]ms,int m){
        int k=m+n;
        int[] temp=new int[k];
        for (int i = 0,nIndex=0,mIndex=0; i < k; i++) {
            System.out.println(nIndex+""+mIndex);
            //当前m 索引是否超出m的有效个数 如果超过则放入ns
            if(mIndex>=m){
                temp[i]=ns[nIndex++];
            }else if(nIndex>=n){
                temp[i]=ms[mIndex++];
            }//如果 ns ms 则放入 ms[mIndex]
            else
            {
                temp[i]=ms[mIndex++];
            }
        }
        for (int i = 0; i < temp.length; i++) {
            ns[i]=temp[i];
        }
        for (int i = 0; i < temp.length; i++) {
            System.out.println(temp[i]);
        }
    }
    public static void merge1(int[]ns,int n,int[]ms,int m){
        int k=m+n;
        for(int i=k-1,nIndex=n-1,mIndex=m-1;i>=0;i--){
            if(nIndex<0){
                ns[i]=ms[mIndex--];
            }else if(mIndex<0){
                break;
            }else if(ns[nIndex]>ms[mIndex]){
                ns[i]=ns[nIndex--];
            }else{
               ns[i]=ms[mIndex--];
            }
        }
        for (int i = 0; i < ns.length; i++) {
            System.out.println(ns[i]);
        }
    }

}

你可能感兴趣的:(算法刷题,算法,java,数据结构)