描述
给出一个整数数组A和有序的整数数组B,请将数组A合并到数组B中,变成一个有序的升序数组
注意:
1.可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n,A的数组空间大小为 m+n
2.不要返回合并的数组,返回是空的,将数组B的数据合并到A里面就好了
3.A数组在[0,m-1]的范围也是有序的
例1:
A: [1,2,3,0,0,0],m=3
B: [2,5,6],n=3
合并过后A为:
A: [1,2,2,3,5,6]
分析:
因为限制空间复杂度,要求要在A数组上进行操作,可以选择逆序合并,不会覆盖A数组的数据。
逆序:
public void merge(int A[], int m, int B[], int n) {
//因为题目明确说了A数组足够大,所以直接在A数组操作
int i = m - 1;
int j = n - 1;
int index = m + n - 1;//AB合并后最后一个元素所在位置
while(i >= 0 && j >= 0)//AB合并,谁大就先放谁
A[index --] = A[i] > B[j] ? A[i --] : B[j --];
while(j >= 0)//如果B没有遍历完,那么之间丢在A数组里面
A[index --] = B[j --];
}
提交结果:答案正确 运行时间:22ms 占用内存:9656KB 使用语言:Java 用例通过率:100.00%
顺序:
public void merge(int A[], int m, int B[], int n) {
int i = 0,j = 0,k = 0;
int[] C = new int[m+n];
while(i < m+n&&j < n&&k < m){
C[i++] = A[k]<B[j]?A[k++]:B[j++];
}
if(j != n||n == 1)
for(;j<n;j++)
C[i++] = B[j];
if(k != m||m == 1)
for(;k<m;k++)
C[i++] = A[k];
for(i = 0;i < m+n;i++)
A[i] = C[i];
}
提交结果:答案正确 运行时间:19ms 占用内存:9764KB 使用语言:Java 用例通过率:100.00%