leetcode练习记录88

88. 合并两个有序数组

class No_0088_Merge:
    """
    题干:
        https://leetcode.cn/problems/merge-sorted-array/
        两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目
        合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列
        题目中要求合并后数组不应由函数返回,而是存储在数组nums1中, nums1预留了足够的0

    解析:
        两个数组分别用一个指针记录当前位置,比较指针位置的值,输出后指针向后移动。
        例如:A=[*1,3,5], B=[*2,6,8], *号代表指针
        1<2,输出:1, 状态:[1,*3,5], [*2,6,8]
        2<3,输出:2, 状态:[1,*3,5], [2,*6,8]
        3<6,输出:3, 状态:[1,3,*5], [2,*6,8]
        5<6,输出:5, 状态:[1,3,5],  [2,*6,8]
        A已经完成,顺序输出B的剩余元素

    """
    @staticmethod
    def sol_two_points(nums1: list, m: int, nums2: list, n: int):
        p0, p1, p2 = 0, 0, 0

        # 复制num1, 原num1作为结果空间
        _nums1 = nums1.copy()
        while p1 < m and p2 < n:
            # 利用有序放入新数组中
            if _nums1[p1] <= nums2[p2]:
                nums1[p0] = _nums1[p1]
                p1 += 1
            else:
                nums1[p0] = nums2[p2]
                p2 += 1
            p0 += 1
        if p1 < m:
            nums1[p0:] = _nums1[p1:m]
        elif p2 < n:
            nums1[p0:] = nums2[p2:n]
        return nums1

    @staticmethod
    def sol_two_points_rev(nums1: list, m: int, nums2: list, n: int):
        # 按题目给出的条件,可以逆向操作,向nums1的末尾填充,提高空间效率
        p0, p1, p2 = m+n-1, m-1, n-1

        while p1 >= 0 and p2 >= 0:
            if nums1[p1] >= nums2[p2]:
                nums1[p0] = nums1[p1]
                p1 -= 1
            else:
                nums1[p0] = nums2[p2]
                p2 -= 1
            p0 -= 1
        if p1 < 0:
            nums1[:p0+1] = nums2[:p2+1]
        elif p2 < 0:
            nums1[:p0+1] = nums1[:p1+1]
        return nums1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值