88. Merge Sorted Array 合并排序数组

2022-04-27  本文已影响0人  sarto

题目

给定两个以非递减序列排序的数组 nums1nums2mn分别表示取 nums1nums2 的元素个数。
以非递减序列合并两个数组,将最终的结果存储到 nums1 中,为了适应这一点,nums1 的长度为 m+n。

解析

在不使用额外空间的情况下,对于一个有序列表使用插入排序可以完成。但是时间复杂度会提高,考虑这两个有序数组,本来可以通过O(m+n)的时间复杂度完成,但是因为空间不足的问题,需要使用插入排序。有没有办法解决空间问题。

因为 nums1 是足够长的,我们考虑将 nums1 先移动到数组的末尾,这样预留出来的位置无论如何都能满足 nums2 的长度,然后采用 O(m+n)复杂度的排序,最终我们能完成这个nums1数组,最后复杂度为O(m+m+n)

1. 首先将 nums1 整体右移 n 个单位
2. 记当前 nums1 的起始指针为 p,nums2 起始指针为 q,结果指针为 i
## 伪代码

move(nums1, n)
p = n
q = 0
for p<m+n && q < n
if nums1[p] < nums2[q]
nums1[i] = nums1[p]
p++
else
nums1[i] = nums2[q]
q++
i++
if p < m+n
nums1[i]=nums1[p]
i++,p++
if q <n
nums1[i]=nums2[q]
i++,p++

代码

func merge(nums1 []int, m int, nums2 []int, n int)  {
    for i:=0;i<m;i++ {
        nums1[m+n-i-1] = nums1[m-i-1]
    }
    p:=n
    q:=0
    i:=0
    for p<m+n && q < n {
        if nums1[p] < nums2[q] {
            nums1[i] = nums1[p]
            p++
        }else {
            nums1[i] = nums2[q]
            q++
        }
        i++
    }
    for p<m+n {
        nums1[i] = nums1[p]
        p++
        i++
    }
    for q<n {
        nums1[i] = nums2[q]
        q++
        i++
    }
}
image.png
上一篇 下一篇

猜你喜欢

热点阅读