美文网首页
20合并两个有序数组

20合并两个有序数组

作者: Jachin111 | 来源:发表于2020-07-28 12:52 被阅读0次

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

    相关文章

      网友评论

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

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