python leetcode (leet code每日一题)

题目链接:

https://leetcode.cn/problems/merge-sorted-array/

以下是使用Go语言实现外观数列问题的代码:

func merge(nums1 []int, m int, nums2 []int, n int) {
    p1 := m - 1
    p2 := n - 1
    p := m + n - 1

    for p1 >= 0 && p2 >= 0 {
        if nums1[p1] >= nums2[p2] {
            nums1[p] = nums1[p1]
            p1--
        } else {
            nums1[p] = nums2[p2]
            p2--
        }
        p--
    }

    for p2 >= 0 {
        nums1[p] = nums2[p2]
        p2--
        p--
    }
}

执行用时:4 ms, 在所有 Go 提交中击败了29.68%的用户

内存消耗:2.2 MB, 在所有 Go 提交中击败了55.02%的用户

通过测试用例:59 / 59

这个问题可以使用双指针法解决。我们定义两个指针p1和p2分别指向nums1和nums2的末尾元素,同时定义一个指针p指向nums1的合并后的末尾位置。

从后往前遍历nums1和nums2,比较nums1[p1]和nums2[p2]的大小,将较大的元素放入nums1[p]的位置,并将相应的指针向前移动。重复这个过程,直到遍历完nums1和nums2中的所有元素。

具体的实现步骤如下:

  1. 初始化指针p1为m - 1,指针p2为n - 1,指针p为m + n - 1。
  2. 当p1和p2都大于等于 0 时,执行以下步骤:
  • 如果nums1[p1]大于等于nums2[p2],将nums1[p1]赋值给nums1[p],并将p1指针向前移动一位。
  • 否则,将nums2[p2]赋值给nums1[p],并将p2指针向前移动一位。
  • 将p指针向前移动一位。
  1. 如果p2大于等于 0,说明nums2中还有剩余的元素未合并,将剩余的元素逐个复制到nums1中。

这段代码的时间复杂度为O(m + n),因为我们只需要遍历一遍nums1和nums2的元素。同时,我们没有使用额外的空间来存储合并后的数组,所以空间复杂度为O(1)。