返回
将两个已排序数组合并为一个排序数组:轻松掌握LeetCode 88 合并两个有序数组题
闲谈
2023-12-26 15:50:18
- 问题概述
LeetCode 88 题的题目如下:
给定两个有序整数数组
nums1
和nums2
,将nums2
合并到nums1
中,使其成为一个有序数组。
nums1
中的元素数量为m
,nums2
中的元素数量为n
。请确保nums1
中有足够的空余空间来容纳nums2
中的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
提示:
0 <= m, n <= 200
1 <= m + n <= 200
-10^9 <= nums1[i], nums2[j] <= 10^9
2. 解题思路
解题思路一:
- 首先,我们需要创建一个新的数组
nums3
,它的大小是m + n
。 - 然后,我们使用两个指针
i
和j
分别指向nums1
和nums2
的首元素。 - 接着,我们将较小的元素添加到
nums3
中,并更新指针i
或j
。 - 重复步骤 3,直到
nums1
和nums2
中的所有元素都添加到nums3
中。 - 最后,我们将
nums3
复制到nums1
中,并返回nums1
。
解题思路二:
- 首先,我们将
nums2
中的所有元素添加到nums1
的末尾。 - 然后,我们将
nums1
排序。 - 最后,我们将
nums1
返回。
3. 实现方法
方法一:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int[] nums3 = new int[m + n];
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
nums3[k++] = nums1[i++];
} else {
nums3[k++] = nums2[j++];
}
}
while (i < m) {
nums3[k++] = nums1[i++];
}
while (j < n) {
nums3[k++] = nums2[j++];
}
for (int l = 0; l < m + n; l++) {
nums1[l] = nums3[l];
}
}
}
方法二:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
4. 总结
LeetCode 88 题是 LeetCode 中一道经典的算法题,它考察了算法的排序能力和数组操作能力。这道题目的解法有很多种,上面给出的两种解法都是比较简单的。读者可以根据自己的喜好选择一种解法进行练习。
5. 延伸思考
- 如果
nums1
和nums2
都是升序的,那么我们是否可以使用更有效率的算法来合并这两个数组呢? - 如果
nums1
的空间不够容纳nums2
中的所有元素,那么我们应该如何处理呢? - 如果
nums1
和nums2
都非常大,以至于无法在内存中容纳,那么我们应该如何合并这两个数组呢?