链接:合并两个有序的数组__牛客网
来源:牛客网
给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组
数据范围: 0≤n,m≤1000 \le n,m \le 1000≤n,m≤100,∣Ai∣<=100|A_i| <=100∣Ai∣<=100, ∣Bi∣<=100|B_i| <= 100∣Bi∣<=100
注意:
1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的
import java.util.*;
public class Solution {
public void merge(int A[], int m, int B[], int n) {
}
}
首先我们要知道,数组A已经被扩容了,同时我们这个题有两个思路,:
第一,合并+排序
这个方法就是需要将B数组都转移至数组A,然后我们在进行排序
这个方法虽然简单,但是效率不是很高。所以我们就得要换一种方法。
第二,双指针思想(合并+排序同时进行)
首先我们要设置三个指针,一个指针指向两个原数组,另外一个指针指向新的数组,这样我们就可以让指向的元素进行比较,较小或者较大的元素先进行移值(前提是这两个数组是有序的)。
但是有个比较的重要的是,我们的新的数组是从头开始进行移值还是,从尾开始?
其实我们这道题已经设置好了,只能从后往前,原因是我们的新的数组是从原来的旧的数组上扩容得到的,从前往后就会将原数组的前面的元素进行覆盖,导致数据丢失。
int i =m-1;
int k = n-1;
int t = m+n-1;
while(i>=0&&k>=0){
if(A[i]>B[k]){
A[t] = A[i];
i--;
t--;
}else{
A[t] = B[k];
k--;
t--;
}
}
所以我们就这样进行设计。
但是我们还有一种情况需要考虑,就是当我们其中一组数据结束后,另外一组数据并不知道是否也全部移值好,所以,这时我们就需要在进行判断,如果没有拍好,那就将剩下的全部按顺序拍进去(原本就是有序数组)。
if(i>=0){
while(i>=0){
A[t] = A[i];
i--;
t--;
}
}
if(k>=0){
while(k>=0){
A[t] = B[k];
t--;
k--;
}
}
所以总的代码段就是:
import java.util.*;
public class Solution {
public void merge(int A[], int m, int B[], int n) {
int i =m-1;
int k = n-1;
int t = m+n-1;
while(i>=0&&k>=0){
if(A[i]>B[k]){
A[t] = A[i];
i--;
t--;
}else{
A[t] = B[k];
k--;
t--;
}
}
if(i>=0){
while(i>=0){
A[t] = A[i];
i--;
t--;
}
}
if(k>=0){
while(k>=0){
A[t] = B[k];
t--;
k--;
}
}
}