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


    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    3、思路

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

  • 相关阅读:
    NGS基础---Plink文件格式ped/map和bed/bim/fam
    J2EE基础:MySQL01
    聚观早报 | 神舟十四号飞行任务圆满成功;大众ID大面积车机故障
    Vue 中 == 和 ===、&& 、|| 等操作符的用法
    逆向学习记录(4)adb
    C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍
    LVS-DR模式
    一文搞懂APT攻击
    gcc 好玩的 builtin 函数
    基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(一)
  • 原文地址:https://blog.csdn.net/weixin_45451320/article/details/126350794