码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • LeetCode #88.合并两个有序数组


    力扣 | 88.合并两个有序数组

    题目截图

    方法一:直接合并然后排序

    利用python的切片让数组nums1的从m到m+n个 位置赋值为数组nums2的元素,然后对nums1的元素排序。

    复杂度

    时间复杂度:O((m+n))log((m+n))

    空间复杂度:O(log(m+n))

    1. class Solution:
    2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    3. """
    4. Do not return anything, modify nums1 in-place instead.
    5. """
    6. nums1[m:m+n] = nums2
    7. nums1.sort()

    完整测试代码

    1. from typing import List
    2. class Solution:
    3. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    4. """
    5. Do not return anything, modify nums1 in-place instead.
    6. """
    7. nums1[m:m+n] = nums2
    8. nums1.sort()
    9. class main:
    10. a = Solution()
    11. num1 = [1, 2, 3, 0, 0, 0]
    12. m = 3
    13. nums2 = [2, 5, 6]
    14. n = 3
    15. b = a.merge(num1, m, nums2, n)
    16. print(num1)
    17. if __name__ == '__main__':
    18. main()

    方法二:双指针 

    方法一没有利用数组为“非递减排序”的性质。可以创建一个新的数组,然后两个指针分别指向原数组nums1和nums2,相互比较大小后存入新数组,最后将新数组的元素赋值给原数组nums1。

    复杂度

    时间复杂度:O(m+n)

    空间复杂度:O(m+n)

    1. class Solution:
    2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    3. """
    4. Do not return anything, modify nums1 in-place instead.
    5. """
    6. sorted_nums = []
    7. p1, p2 = 0, 0
    8. while p1 < m or p2 < n:
    9. if p1 == m:
    10. sorted_nums.append(nums2[p2])
    11. p2 += 1
    12. elif p2 == n:
    13. sorted_nums.append(nums1[p1])
    14. p1 += 1
    15. elif nums1[p1] < nums2[p2]:
    16. sorted_nums.append(nums1[p1])
    17. p1 += 1
    18. else:
    19. sorted_nums.append(nums2[p2])
    20. p2 +=1
    21. nums1[:] = sorted_nums

    方法三:逆向双指针

    方法二需要使用临时变量sorted_nums,因为在合并数组的过程中,数组nums1中的元素可能会被新加入的元素覆盖,导致结果错误。但是数组nums1的后半段是空的,可以让指针从后往前遍历。

     

    复杂度

    时间复杂度:O(m+n)

    空间复杂度:O(1)

    1. class Solution:
    2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
    3. """
    4. Do not return anything, modify nums1 in-place instead.
    5. """
    6. p1, p2 = m-1, n-1
    7. p3 = m+n-1
    8. while p1 >=0 or p2 >= 0:
    9. if p1 == -1:
    10. nums1[p3] = nums2[p2]
    11. p2 -= 1
    12. elif p2 == -1:
    13. nums1[p3] = nums1[p1]
    14. p1 -= 1
    15. elif nums1[p1] > nums2[p2]:
    16. nums1[p3] = nums1[p1]
    17. p1 -= 1
    18. else:
    19. nums1[p3] = nums2[p2]
    20. p2 -=1
    21. p3 -= 1

     

  • 相关阅读:
    [附源码]计算机毕业设计体育器材及场地管理系统Springboot程序
    垃圾收集器与内存分配策略
    融新聚力,筑梦畅行|云畅科技“融云计划”第一期集训营圆满结营
    web前端页面基础
    DiffusionDet: Diffusion Model for Object Detection
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    linux下安装向日葵
    拒绝灵感焦虑,藏在UI设计师书签里的宝藏网站!
    「SpringCloud」01 Eureka服务注册与发现
    Spring Boot 自定义配置元数据
  • 原文地址:https://blog.csdn.net/weixin_42112343/article/details/126058862
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号