给出两个有序的整数数组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);
}
}