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

力扣

方法一:默认排序算法 合并后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]);
        }
    }
}

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

 

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

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 则新的数组中放入ns[nIndex]值
            else if (ns[nIndex]<ms[mIndex]) {
                temp[i]=ns[nIndex++];
            }//如果 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]);
        }
    }
}

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

方法二:

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

    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 则新的数组中放入ns[nIndex]值
            else if (ns[nIndex]<ms[mIndex]) {
                temp[i]=ns[nIndex++];
            }//如果 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]);
        }
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值