「力扣」第 88 题:从后向前归并两个有序数组


「力扣」第 88 题:从后向前归并两个有序数组

传送门:英文网址:88. Merge Sorted Array ,中文网址:88. 合并两个有序数组

给定两个有序整数数组 nums1nums2*,将 *nums2 合并到 nums1使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1nums2 的元素数量分别为 mn
  • 你可以假设 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]

分析:其实就是归并排序,不过从后向前归并是这道题的考点。注意分 4 种情况,代码的写法其实是相对固定的。

思路1:可以使用标准的归并排序来做。

Python 代码:从前向后写

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
        nums3 = nums1.copy()

        i = 0
        j = 0

        for k in range(m + n):
            if i == m:  # i 用完了
                nums1[k] = nums2[j]
                j += 1
            elif j == n:
                nums1[k] = nums3[i]
                i += 1
            elif nums3[i] < nums2[j]:
                nums1[k] = nums3[i]
                i += 1
            else:
                nums1[k] = nums2[j]
                j += 1

思路2:考虑到这道题的特殊性,即 nums1 有足够的空间,因此,我们可以从后向前归并,每次从两个数组的末尾选出最大的元素放在 nums1 的末尾,而不使用额外的数组空间。

你可能会担心,nums1 之前有效的元素会不会被覆盖掉,但在这题中,这种情况是不可能出现的。在实现的时候,还是要特别注意一些边界条件。

Python 代码:从后向前写

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """

        i = m - 1
        j = n - 1

        for k in range(m + n - 1, -1, -1):
            if i == -1: 
                nums1[k] = nums2[j]
                j -= 1
            elif j == -1:
                nums1[k] = nums1[i]
                i -= 1
            elif nums1[i] > nums2[j]:
                nums1[k] = nums1[i]
                i -= 1
            else:
                nums1[k] = nums2[j]
                j -= 1

说明:range(m + n - 1, -1, -1) 表示索引的最大值是 m + n - 1 ,最小值是 0

(本节完)


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「力扣」第 125 题:验证回文串 「力扣」第 125 题:验证回文串
「力扣」第 125 题:验证回文串链接:https://leetcode-cn.com/problems/valid-palindrome 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我
下一篇 
「力扣」第 80 题 :删除排序数组中的重复项 II 「力扣」第 80 题 :删除排序数组中的重复项 II
「力扣」第 80 题 :删除排序数组中的重复项 II 中文网址:80. 删除排序数组中的重复项 II ; 英文网址:80. Remove Duplicates from Sorted Array II 。 给定一个排序数组,你需要在
  目录