将两个有序数组合并到一起

给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组

注意:

可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n

 

暴力:t((n+m)*log(m+n))  s(1)

System.arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组起始位置, 复制的长度); 方法实现复制:

解题思路;

1.将B复制到A后面

2.整体排序(没有用到A,B有序的条件)

import java.util.*;
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
          System.arraycopy(B,0,A,m,n);
          Arrays.sort(A);
    }
}

双指针 / 从前往后 T(n+m),s(n+m)

解题思路;

1.复制A 到A_copy;

2.p1指向A_copy,p2指向B,p指向A,同时遍历A_copy,和B,小的放在A中

3.B结束,剩下A_copy,直接放到A中

4.A_copy结束,剩下B,,直接放到A中

import java.util.*;
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
        int[] A_copy=new int[m];//A_copy用来记录A
        System.arraycopy(A,0,A_copy,0,m);//A_copy复制A
        //p1指向A,p2指向B
           int p1=0;
           int p2=0;
           int p=0;
           while((p1<m) &&(p2<n)){
               A[p++]=(A_copy[p1]>B[p2])?B[p2++]:A_copy[p1++];
           }
           //B结束,剩下A——copy
           if(p1<m){
               System.arraycopy(A_copy,p1,A,p1+p2,m+n-p1-p2);
           }
           //A_copy结束,剩下B
           if(p2<n){
            System.arraycopy(B,p2,A,p1+p2,m+n-p1-p2);
        }
    }
}

双指针 / 从后往前  T(n+m)   s(1)

 解题思路:

1.p1指向A尾巴,p2指向B尾巴,p指向A和B的长度之和,同时遍历A和B,大的放在p指的位置中

3.B结束,剩下A,直接放到A中,不用遍历(p1和p重合)

4.A结束,剩下B,,直接复制到A中,个数是p2+1

import java.util.*;
public class Solution {
    public void merge(int A[], int m, int B[], int n) {
               int p1=m-1;
               int p2=n-1;
               int p=m+n-1;
               while(p1>=0 && p2>=0){
                   A[p--]=(A[p1]>B[p2])?A[p1--]:B[p2--];
               }
              //A遍历结束了,剩下了B
               System.arraycopy(B,0,A,0,p2+1);
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值