【leetcode刷题】面试经典150题 88.合并两个有序数组

leetcode刷题
面试经典150
88. 合并两个有序数组
难度:简单

文章目录

  • 一、题目内容
  • 二、自己实现代码
    • 2.1 实现思路
    • 2.2 实现代码
    • 2.3 结果分析
  • 三、 官方解法
    • 3.1 直接合并后排序
      • 3.1.1 算法实现
      • 3.1.2 代码实现
      • 3.1.3 代码分析
    • 3.2 双指针
      • 3.2.1 算法实现
      • 3.2.2 代码实现
        • 3.2.2.1 错误版本1
        • 3.2.2.2 错误版本2
        • 3.2.2.3 正确版本
      • 3.2.3 代码分析
    • 3.3 逆指针
      • 3.3.1 算法实现
      • 3.3.2 代码实现
      • 3.1.3 代码分析
  • 四、一些注意的地方
  • 第三部分参考官方题解:

一、题目内容

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

  • 注意:
    • 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中
    • 为了应对这种情况:
    • nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,
    • nums2 的长度为 n

二、自己实现代码

2.1 实现思路

  • 可以直接将 num2覆盖到 num1的后n个元素上
  • 借助python的sort函数,一键实现排序

2.2 实现代码

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        for i in range(n):
            nums1[i+m] = nums2[i]
        nums1.sort()

2.3 结果分析

在这里插入图片描述

三、 官方解法

感觉直接调用sort算是取巧了,官方一定不希望这样解出来,所以,把官方解法也放过来了

3.1 直接合并后排序

3.1.1 算法实现

先将数组 nums2 放进数组 nums1 的尾部,然后直接对整个数组进行排序

3.1.2 代码实现

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.
        """
        nums1[m:] = nums2
        nums1.sort()

3.1.3 代码分析

  • 时间复杂度:O((m+n)log⁡(m+n))
    排序序列长度为 m+n,套用快速排序的时间复杂度即可,平均情况为 O((m+n)log⁡(m+n))

  • 空间复杂度:O(log⁡(m+n))
    排序序列长度为 m+n,套用快速排序的空间复杂度即可,平均情况为 O(log⁡(m+n))

3.2 双指针

3.2.1 算法实现

  • 利用num1和num2都是排好序的性质,使用双指针方法
  • 将两个数组看作队列,每次从两个数组头部取出比较小的数字放到结果中
  • 具体思路
    • 首先,两个初始位置都是0
    • 然后,声明一下新的list,后面用来覆盖掉num1
    • 开始比较第一个位置上的值,取min的放入new_list中
    • 遍历结束停止

3.2.2 代码实现

3.2.2.1 错误版本1
  • 是自己对着这个思路实现的
  • 但是,忽略了两个list存在比较结束的情况
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.
        """
        p = 0
        q = 0
        new_list = []
        while p<m or q<n:
        	if num1[p] <= num2[q]:
        		new_list.append(num1[p])
        		p += 1
			else:
				new_list.append(num2[q])
        		q += 1
		num1 = new_list
3.2.2.2 错误版本2
  • 添加上了两个list存在比较结束的情况
  • 对于list的覆盖,不能直接相等
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.
        """
        p = 0
        q = 0
        new_list = []
        while p<m or q<n:
            if p == m:
                new_list.append(nums2[q])
                q += 1
            elif q == n:
                new_list.append(nums1[p])
                p +=1
            elif nums1[p] <= nums2[q]:
        		new_list.append(nums1[p])
        		p = p+1
            else:
				new_list.append(nums2[q])
				q += 1  
        nums1 = new_list

在这里插入图片描述

3.2.2.3 正确版本
  • 对于list的覆盖,不能直接相等
  • nums1[:] = new_list
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.
        """
        p = 0
        q = 0
        new_list = []
        while p<m or q<n:
            if p == m:
                new_list.append(nums2[q])
                q += 1
            elif q == n:
                new_list.append(nums1[p])
                p +=1
            elif nums1[p] <= nums2[q]:
        		new_list.append(nums1[p])
        		p = p+1
            else:
				new_list.append(nums2[q])
				q += 1  
        nums1[:] = new_list

在这里插入图片描述

3.2.3 代码分析

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

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

3.3 逆指针

3.3.1 算法实现

先将数组 nums2  放进数组 nums1  的尾部,然后直接对整个数组进行排序

3.3.2 代码实现

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.
        """
        p1, p2 = m - 1, n - 1
        tail = m + n - 1
        while p1 >= 0 or p2 >= 0:
            if p1 == -1:
                nums1[tail] = nums2[p2]
                p2 -= 1
            elif p2 == -1:
                nums1[tail] = nums1[p1]
                p1 -= 1
            elif nums1[p1] > nums2[p2]:
                nums1[tail] = nums1[p1]
                p1 -= 1
            else:
                nums1[tail] = nums2[p2]
                p2 -= 1
            tail -= 1

3.1.3 代码分析

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

  • 空间复杂度:O(1)

四、一些注意的地方

  1. 直接使用sort可以让时间更快, 但是空间复杂度会高
  2. 考虑指针的情况下,时间复杂度和空间复杂度会减小
  3. 在看到list有顺序的时候,可以考虑增加一下指针
  4. 从小到大取,会增加新的list,造成不必要的资源浪费
  5. 在单个list空间位置够的情况下,可以优先考虑逆指针,倒着走max放后面
  6. 给list赋list, 需要 nums[:] = new_list

第三部分参考官方题解:

  • 链接:https://leetcode.cn/problems/merge-sorted-array/solutions/666608/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/717177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

列表(list)(Python)

文章目录 一、定义二、列表常用操作 一、定义 list ["张三", "李四", "王五", "赵六"]二、列表常用操作 分类关键字/函数/方法说明增加列表.append(值)在列表末尾追加值列表.insert(索引&#xff0c; 值)在指定位置插入值&#xff…

从11个视角看全球Rust程序员1/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 五个月前,编程界的大佬JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中找出了下面11个关于全球程序员如何使用Rust的有趣的趋势,让你学习和使用Rust更轻松。 1 这两年有多少程序员在工作中使用了Rust? 2 全球程序员使用Rust有多…

2024年数字媒体、新闻与管理国际会议(DMJM 2024)

2024年数字媒体、新闻与管理国际会议&#xff08;DMJM 2024&#xff09; 2024 International Conference on Digital Media, Journalism, and Management 【重要信息】 大会地点&#xff1a;长沙 大会官网&#xff1a;http://www.cdmjm.com 投稿邮箱&#xff1a;cdmjmsub-conf…

colab挂载googledrive云盘

参考&#xff1a; Google Colab简易\入门\常规\常用操作和命令_colab快捷键-CSDN博客 首先新建一个或者打开一个笔记本。 等待连接成功。 点击这个图标&#xff0c;变为如下这样: 挂载成功。 这里我是用现有的ipynb文件挂载&#xff1a; 他让我运行代码: 他会提示这个运行这…

相约北京“信通院数据智能大会”

推动企业数智化转型发展&#xff0c;凝聚产业共识&#xff0c;引领行业发展方向&#xff0c;摩斯将参与信通院首届“数据智能大会”&#xff08;6月19-20日&#xff0c;北京&#xff09;。 本次大会设置多个主题论坛&#xff0c;将发布多项研究成果&#xff0c;分享产业最新实…

微信核销通知地址设置返回:请开通回调通知产品权限

1.背景 微信代金券设置核销通知地址时返回: {"code":"REQUEST_BLOCKED","message":"请开通回调通知产品权限\n"} 2.解决方法 登录对应的微信商户号,然后访问如下链接: 微信支付 - 中国领先的第三方支付平台 &#xff5c; 微信支付提…

从11个视角看全球Rust程序员2/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 5 Rust代码最常使用什么协议与其他代码交互? REST API: 2022年:51%2023年:51%看上去REST API的使用比例挺稳定的,没啥变化。语言互操作性(Language Interop): 2022年:53%2023年:43%语言互操作性的比例在2023年下来了一些,掉了10个百分点…

编译器优化入门(基于ESP32)

主要参考资料&#xff1a; kimi: https://kimi.moonshot.cn/ ESP-IDF 支持多种编译器&#xff0c;但默认情况下&#xff0c;它使用的是乐鑫官方提供的 Xtensa 编译器&#xff0c;这是一个针对 ESP32 芯片架构&#xff08;Tensilica Xtensa LX6 微处理器&#xff09;优化的交叉编…

springboot应用启动太慢排查 半天才打印日志

springboot应用启动太慢排查 半天才打印日志 解决办法 hostnamectl 命令查看主机名 vim /etc/hosts 加上主机名配置 127.0.0.1 hostname

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 火星字符串(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Elixir学习笔记——Erlang 库

Elixir 提供了与 Erlang 库的出色互操作性。事实上&#xff0c;Elixir 不鼓励简单地包装 Erlang 库&#xff0c;而是直接与 Erlang 代码交互。在本节中&#xff0c;我们将介绍一些 Elixir 中没有的最常见和最有用的 Erlang 功能。 Erlang 模块的命名约定与 Elixir 不同&#x…

电商风控指南 | 直播间里的藏匿的“羊毛党”,普通消费者看不到

目录 直播间里的羊毛党 电商要针对性进行防范 随着618网购节的开启&#xff0c;各大电商平台的直播间再次成为消费者关注的焦点。在5月20日的一场酒水电商直播中&#xff0c;主播仅用43分钟便实现了成交额破亿&#xff0c;售出3万瓶白酒。然而&#xff0c;这些“秒杀”特价商品…

Excel加密怎么设置?这5个方法不容错过!(2024总结)

Excel加密怎么设置&#xff1f;如何不让别人未经允许查看我的excel文件&#xff1f;如果您也有这些疑问&#xff0c;那么千万不要错过本篇文章了。今天小编将向大家分享excel加密的5个简单方法&#xff0c;保证任何人都可以轻松掌握&#xff01;毫无疑问的是&#xff0c;为Exce…

SpringBoot配置第三方专业缓存技术jetcache远程缓存方案和本地缓存方案

JetCache 是一个基于 Java 的分布式缓存解决方案&#xff0c;旨在提供高性能和可扩展性。它支持多种后端存储&#xff0c;如 Redis、Hazelcast、Tair 等&#xff0c;可以作为应用程序的缓存层&#xff0c;有效地提升数据访问性能和响应速度。 JetCache 的主要特点包括&#x…

语音识别相关文章整理目录

一、语音大模型架设与功能实现 使用sherpa-ncnn进行中文语音识别&#xff08;ubuntu22&#xff09;-CSDN博客文章浏览阅读953次&#xff0c;点赞30次&#xff0c;收藏26次。请注意&#xff0c;需要首先安装安装了所有必要的依赖项&#xff0c;包括 CMake、Git 和一个合适的 C/…

Vue路由讲解-05

这里的路由并不是指我们平时所说的硬件路由器&#xff0c;这里的路由就是SPA&#xff08;single page application单页应用&#xff09;的路径管理器。再通俗的说&#xff0c;vue-router就是WebApp的链接路径管理系统。 vue-router是Vue.js官方的路由插件&#xff0c;它和vue.j…

一道全等三角形证明题

接着上次那道题 一道初中一年级几何题解析&#xff0c;再来做一道初中一年级下半学期几何题目&#xff1a; 傍晚丢垃圾散步时看到小小的学生学习群里丢了这个题目&#xff0c;想到一个解法。实在构造不出契合题干阅读材料结论的三角形&#xff0c;索性先根据这结论做一个推论…

云动态摘要 2024-06-17

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [低至1折]腾讯混元大模型产品特惠 腾讯云 2024-06-06 腾讯混元大模型产品特惠&#xff0c;新用户1折起&#xff01; 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

从《2024年人工智能指数报告》 看AI的最新发展趋势

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 《2024年人工智能指数报告》是由斯坦福大学的“以人为本”人工智能研究所&#xff08;Stanford HAI&#xff09;发布的&#xff0c;具体发布时间…

使用宝塔面板部署Django应用(不成功Kill Me!)

使用宝塔面板部署Django应用 文章目录 使用宝塔面板部署Django应用 本地操作宝塔面板部署可能部署失败的情况 本地操作 备份数据库 # 备份数据库 mysqldump -u root -p blog > blog.sql创建requirements # 创建requirements.txt pip freeze > requirements.txt将本项目…