合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解题思路:双指针
题目给出的 nums1 和 nums2 均为有序数组,一般有序数组的题目,我们可以思考利用双指针进行解答。
因此,我们可以从后向前遍历两个数组,比较两个数组中的最大值,每次遍历比较值大小之后,则进行填充。
代码:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// 双指针 从后向前遍历
int index_1 = m - 1; // 指向nums1,从后向前遍历
int index_2 = n - 1; // 指向nums2,从后向前遍历
int index = m + n - 1; // 指向最终排序后的nums1,从后向前填充
// 对比两个数组当前的最大值,最大的先放在新数组的最后
while(index_1 >= 0 && index_2 >= 0) {
if(nums1[index_1] <= nums2[index_2]) {
nums1[index--] = nums2[index_2--];
}else {
nums1[index--] = nums1[index_1--];
}
}
// 如果nums2还有数未填到nums1中,直接赋值即可
while(index_2 >= 0) {
nums1[index--] = nums2[index_2--];
}
}
}
时间复杂度:O(m + n)
空间复杂度:O(1)
本文介绍了一种使用双指针法合并两个有序数组的方法。通过从后向前遍历两个数组,并比较其最大值,将较大值填充到目标数组的末尾,最终实现数组合并。此方法时间复杂度为O(m+n),空间复杂度为O(1)。
1258

被折叠的 条评论
为什么被折叠?



