88 - 合并两个有序数组 - python

给你两个有序整数数组 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]

题目给定了两个有序数组,并且说明了两个数组的元素个数。因此,暴力的方法就是分别取两个数组的元素到nums1中,然后排序即可。因为要依次遍历数组元素,合并两个数组的时间复杂度为 O ( m + n ) O(m + n) ,使用sorted()的时间复杂度为 O ( n ) O(n) 。因此,整体的时间复杂度为 O ( ( m + n ) log ( m + n ) ) O((m+n)\log(m+n))

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.
        """
        # nums1中只有前m个数不为零,所以只需要取前m个数进行合并
        nums1[:] = sorted(nums1[:m] + nums2)

或者将nums1中的元素另外保存,使用双指针执行归并过程,依次在nums1中放入当前最小的元素。

import copy
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.
        """
        # nums1中只有前m个数不为零,所以只需要取前m个数进行合并
        temp = copy.deepcopy(nums1[:m])
        i = 0
        p, q = 0, 0

        while p < m and q < n:
            if temp[p] <= nums2[q]:
                nums1[i] = temp[p]
                i += 1
                p += 1
            else:
                nums1[i] = nums2[q]
                i += 1
                q += 1
        
        # if there are still elements to add
        if p < m: 
            nums1[p + q:] = temp[p:]
        if q < n:
            nums1[p + q:] = nums2[q:]


上面的方法是从头到尾合并,同样可以从尾到头进行合并。彼此比较两个数组中尾部元素大小,将大的元素插入到nums1的相应位置,位置索引使用i表示,i初始化为 i = m + n 1 i=m+n-1

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.
        """
        p = m -1
        q = n -1
        i = m + n - 1
        while p >= 0 and q >= 0:
            if nums1[p] > nums2[q]:
                nums1[i] = nums1[p]
                p -= 1
            else:
                nums1[i] = nums2[q]
                q -= 1
            i -= 1

        while q >= 0:
            nums1[i] = nums2[q]
            q -= 1
            i -= 1
发布了448 篇原创文章 · 获赞 122 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/105374243