美文网首页python/go刷题篇
合并两个有序数组

合并两个有序数组

作者: 超鸽带你飞 | 来源:发表于2021-09-28 19:46 被阅读0次

题目
给定两个有序正整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小等于 m + n)来保存 nums2 中的元素。
不开辟新的slice临时空间。

思路:归并思想
复杂度分析
时间复杂度:O(m+n)O(m+n)。
指针移动单调递增,最多移动 m+nm+n 次,因此时间复杂度为 O(m+n)O(m+n)。

空间复杂度:O(m+n)O(m+n)。
需要建立长度为 m+nm+n 的中间数组 \textit{sorted}sorted。

func merge(l1 []int, m int, l2 []int, n int) {
    index := m + n - 1
    p1, p2 := m-1, n-1

    for p1 >= 0 && p2 >= 0 {
        if l1[p1] >= l2[p2] {
            l1[index] = l1[p1]
            p1--
        } else {
            l1[index] = l2[p2]
            p2--
        }
        index--
    }

    for p1 >= 0 {
        l1[index] = l1[p1]
        p1--
        index--
    }

    for p2 >= 0 {
        l2[index] = l2[p2]
        p2--
        index--
    }

    fmt.Println(l1)
}

# 开辟新空间
func merge(l1 []int, l2 []int) {
    m1 := len(l1)
    m2 := len(l2)
    p1, p2 := 0, 0
    l := make([]int, 0, m1+m2)

    for {
    //for p1 <= m1 && p2 <= m2 {
        if p1 == m1 {
            l = append(l, l2[p2:]...)
            break
        }
        if p2 == m2 {
            l = append(l, l1[p1:]...)
            break
        }
        if l1[p1] < l2[p2] {
            l = append(l, l1[p1])
            p1++
        } else {
            l = append(l, l2[p2])
            p2++
        }
    }

    fmt.Println(l)
}

相关文章

网友评论

    本文标题:合并两个有序数组

    本文链接:https://www.haomeiwen.com/subject/kzmrnltx.html