大厂面试手撕面试题:合并两个有序数组(亲测可用的java实现)
在面试中,如果遇到要求合并两个有序数组的问题,可以通过以下步骤来实现:
思路:
- 双指针法:我们使用两个指针分别指向两个数组的起始位置。
- 比较大小:每次比较两个数组当前指针指向的元素,将较小的元素加入到结果数组中,并移动对应的指针。
- 处理剩余元素:当其中一个数组的所有元素都被合并到结果数组中时,另一个数组剩余的元素直接追加到结果数组中。
关键点:
- 如果两个数组的长度分别为
n
和m
,那么合并的时间复杂度是O(n + m)
,因为每个元素只会被处理一次。 - 空间复杂度是
O(n + m)
,因为我们需要一个新的数组来存储结果。
时间复杂度:
- 时间复杂度:
O(n + m)
,其中n
和m
分别是两个数组的长度。我们需要遍历两个数组的每个元素一次。
空间复杂度:
- 空间复杂度:
O(n + m)
,因为我们需要一个新的数组来存储合并后的结果。
Java代码实现:
public class MergeSortedArrays {
// 合并两个有序数组
public static int[] merge(int[] arr1, int[] arr2) {
// 创建一个新数组,大小为两个数组之和
int n = arr1.length;
int m = arr2.length;
int[] result = new int[n + m];
int i = 0, j = 0, k = 0;
// 合并两个数组,直到有一个数组遍历完
while (i < n && j < m) {
if (arr1[i] <= arr2[j]) {
result[k++] = arr1[i++];
} else {
result[k++] = arr2[j++];
}
}
// 将剩余元素添加到结果数组中
while (i < n) {
result[k++] = arr1[i++];
}
while (j < m) {
result[k++] = arr2[j++];
}
return result;
}
public static void main(String[] args) {
int[] arr1 = {1, 3, 5, 7};
int[] arr2 = {2, 4, 6, 8};
int[] mergedArray = merge(arr1, arr2);
// 打印合并后的数组
System.out.print("Merged array: ");
for (int num : mergedArray) {
System.out.print(num + " ");
}
}
}
解释:
- 我们通过
merge
方法来合并两个有序数组arr1
和arr2
。 - 使用三个指针
i
,j
,k
:i
用来遍历arr1
。j
用来遍历arr2
。k
用来填充合并结果数组result
。
- 每次比较
arr1[i]
和arr2[j]
,将较小的元素放入result[k]
中,移动对应的指针。直到其中一个数组遍历完。 - 剩余未遍历完的数组直接复制到结果数组的末尾。
输出:
Merged array: 1 2 3 4 5 6 7 8