初级算法_排序和搜索 --- 合并两个有序数组

发布于:2023-01-16 ⋅ 阅读:(287) ⋅ 点赞:(0)

1、题目

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6]
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1] 和 []
合并结果是 [1]

示例 3:
输入:nums1 = [0], m = 0, nums2 = [1], n = 1
输出:[1]
解释:需要合并的数组是 [] 和 [1]
合并结果是 [1]
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。

2、代码

from typing import List


class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:

        # nums1 = nums1 + nums2
        # nums1.sort()
        # a = nums1[n:]
        # print(a)
        # return a
        # 通过测试用例
        # 3 / 59

        # for i in range(len(nums1)):
        #     if nums1[i] == 0:
        #         for j in nums2:
        #             nums1[i] = j
        #             i += 1
        # print(nums1)
        # return nums1
        # # 通过测试用例
        # # 8 / 59

        # """
        # 将数组nums2放到nums1的尾部,然后直接怼整个数组进行排序
        # 截取nums1的m位置后面的取值,并重新赋值为 nums2,重新赋值是在原列表上赋值的,所以可行
        # """
        # nums1[m:] = nums2
        # nums1.sort()

        """
        双指针:
        利用nums1和2已经被排序的性质,2个指针,将两个队列的头部较小的数字放到结果中

        如果 nums1 的第一个元素 小于 nums2 的第一个元素,则nums1[0]存入新列表,且 nums1 的指针后移一位
        如果 nums1 的第一个元素 大于 nums2 的第一个元素,则nums2[0]存入新列表,且 nums2 的指针后移一位

        first, second = 0, 0  # 给2个列表都定义一个指针
        while first < y:  # 开始从头遍历
            条件逻辑
            x += 1  # 符合条件了指针移动
        """
        sorted = []
        p1, p2 = 0, 0
        while p1 < m or p2 < n:
            if p1 == m:  # 如果 nums1 的指针等于0的时候,把nums2的元素依次加入到数组中
                sorted.append(nums2[p2])
                p2 += 1
            elif p2 == n:  # 如果 nums2 的指针等于0的时候,把nums1的元素依次加入数组中
                sorted.append(nums1[p1])
                p1 += 1
            elif nums1[p1] < nums2[p2]:  # 如果 数组1 的指针位置元素 小于 数组2指针位置的元素,则数组1元素的加入新数组
                sorted.append(nums1[p1])
                p1 += 1
            else:
                sorted.append(nums2[p2])  # 如果 大于,则将 数组2元素 加入新数组
                p2 += 1
        nums1[:] = sorted


class TestSolution:

    def test_three(self):
        b = Solution()
        b.merge(nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3)

    def test_two(self):
        b = Solution()
        b.merge(nums1 = [1], m = 1, nums2 = [], n = 0)

    def test_one(self):
        b = Solution()
        b.merge(nums1 = [0], m = 0, nums2 = [1], n = 1)

3、思路

nums1[m:] = nums2:给 nums1 的区间赋值,直接在原地修改的
num1[:] = nums2[::-1]:反转数组

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到