给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使 num1 成为有序数组。
说明:初始化 nums1 和 nums2 的元素个数分别为 m 和 n。
您可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来容纳 nums2 中的元素。
示例: 输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]。
阿里 腾讯 字节 Loomberg Facebook Microsoft 合并 排序 直观的方法将 nums2 插入到 num1 的末尾并排序
特定**:
这个解决方案甚至没有使用 m,这显然不是提问者的意思:if (n === 0) return; let current2 = 0;for (let i = nums1.length - 1; i >= nums1.length - n; i--)nums1.sort((a, b) => a - b);当然,你可以自己写排序,我懒得在这里写,因为它已经偏离了主题本身
这个问题其实和基本排序算法是一样的merge sort
非常喜欢。
我们先来回顾一下合并排序的合并过程。 合并过程是的
首先比较这两个数组Header 元素,然后将较小的一个推入最终数组,并将其从原始数组中删除。 继续循环,直到两个数组都为空。
具体如下:
使用函数 merge(nums1, nums2) 合并 nums1 和 nums2 if (j === nums2.)。length) const a = nums1[i]; const b = nums2[j]; if (a > b) else }return ret;}
但是合并排序很多时候,在合并的时候,我们通常会创建一个新的数组,但是这个问题需要原位修改
.这与合并排序的合并过程略有不同。 这需要原位修改。 如果使用上述方法,则从头开始使用nums1 的前 m 个数组需要放在另一个数组中,以避免写指针写字的干扰。则对空间复杂度进行$o(m)$。 事实上,我们可以从从后到前比较,从后到前插入。 我们需要三点:
写指针电流,用于记录当前填充到该位置,m 用于记录 nums1 数组被处理到哪个元素,n 用于记录 nums2 数组被处理到哪个元素,如图所示:
灰色表示已在 num2 数组中处理的元素,红色表示当前正在比较的元素,绿色表示已到位的元素
从后到前比较,从后到前插入,以避免写入指针的影响,同时将空间复杂度降低到 $o(1)$
*支持:Python3,C++,J**A,J**Ascript
j**ascript code:
var merge = function (nums1, m, nums2, n) if (n < 1) 在 nums1 末尾取大填充并更新 m 或 n if (nums1[m - 1] >nums2[n - 1]) else }
c++ code:
class solution if (n < 1) if (nums1[m - 1] >nums2[n - 1]) nums1[current--]= nums1[--m]; else nums1[current--]= nums2[--n];
j**a code:
类解决方案 else } 合并剩余的 nums2 while(j>=0)。
python code:
class solution: def merge(self, nums1: list[int], m: int, nums2: list[int], n: int) -none: """ do not return anything, modify nums1 in-place instead. """ pos = m + n - 1 while m > 0 and n > 0: if nums1[m - 1] 0: nums1[pos] = nums2[n - 1] n -= 1 pos -= 1
复杂性分析时间复杂度:$o(m + n)$Space复杂度:$o(1)$