《刷题笔记》牛客网 合并两个有序数组(一刷)
题目分析
暴力一点,先合并再排序,不过这就失去刷题的意义了
由于它是两个有序的数组,所以可以采取双指针的思想去写。
思路分析
题目已经给出了,数组A 是可以存放下数组B的,我们利用三个下标来操作数组这个两个数组
下标1 : int i = m-1 : 指向数组A的最后一个元素
下标2: int j = n-1 : 指向数组B的最后一个元素
下标3: int k = m+n-1: 指向数组A的最大位置
将A[i]与B[j]进行比较,如果大于的话,将A[i] 放再 A[k]中,小于的话,就将B[j]放在A[k]z中,因为A[i]或者B[j]就是所以数字最大了。如此循环下去,两个数组的最大数字便依次放入了。但是注意可能i或者j先到达了0位子,所以还需要做最后一步的拷贝。
代码:
import java.util.*;
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int i = m-1;
int j = n-1;
int k = m+n-1;
while(i>=0&&j>=0){ //将最大的数字放在A[k]的位子
if(B[j]>=A[i]){
A[k] = B[j];
k--;
j--;
}else{
A[k] = A[i];
k--;
i--;
}
}
while(i>=0){ //拷贝
A[k] = A[i];
i--;
k--;
}
while(j>=0){ //拷贝
A[k] = B[j];
j--;
k--;
}
}
}
运行结果:
总结:
比较巧妙的方法,可以这么做的前提比较多,需要两个数组已经是有序的了。