20合并两个有序数组

2020-07-28  本文已影响0人  Jachin111

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:
初始化 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 = A 和 nums1[:] = A 的不同之处:
nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象
nums1[:] = A # 对 nums1 指向的对象赋值。把 A 变量指向的对象的值逐个 copy 到 nums1 指向的对象中并覆盖 nums1 指向的对象的原来值。
nums1[:] 等价于 nums1[0:len(nums1)] 相当于取 nums1 对应的对象的一个视图,通常用这个来改变原对象的某几位值。
比如有时候,我们用 A[:2] = [0,1], 来改变 A 所指向的 list 对象的前两个值。
而如果用 A = [0,1], 则是让 A 这一变量名指向新的 list 对象 [0,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.
        """
        if 0 == n:
            pass
        elif 0 == m:
            nums1[:n] = nums2[:n]
        else:
            a, b = m-1, n-1
            k = m+n-1
            while (a>=0) and (b>=0):
                if nums1[a]<=nums2[b]: #  nums1 的元素尽量少动
                    nums1[k] = nums2[b]
                    k -= 1
                    b -= 1
                else:
                    nums1[k] = nums1[a]
                    k -= 1
                    a -= 1
            if (a>=0):
                pass
            if (b>=0):
                nums1[k-b:k+1] = nums2[:b+1]  # 必然有 k-b == 0,因为剩下的是最小的,必然是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.
        """
        end=m+n-1
        end_1=m-1
        end_2=n-1
        while(end_1>=0 and end_2>=0):
            if(nums1[end_1]>=nums2[end_2]):
                nums1[end]=nums1[end_1]
                end_1-=1
                end-=1
            else:
                nums1[end]=nums2[end_2]
                end_2-=1
                end-=1
        nums1[:end_2+1]=nums2[:end_2+1]

来源:力扣(LeetCode)

上一篇下一篇

猜你喜欢

热点阅读