【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:] = nums2nums1.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 = 0q = 0new_list = []while p<m or q<n:if num1[p] <= num2[q]:new_list.append(num1[p])p += 1else:new_list.append(num2[q])q += 1num1 = 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 = 0q = 0new_list = []while p<m or q<n:if p == m:new_list.append(nums2[q])q += 1elif q == n:new_list.append(nums1[p])p +=1elif nums1[p] <= nums2[q]:new_list.append(nums1[p])p = p+1else: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 = 0q = 0new_list = []while p<m or q<n:if p == m:new_list.append(nums2[q])q += 1elif q == n:new_list.append(nums1[p])p +=1elif nums1[p] <= nums2[q]:new_list.append(nums1[p])p = p+1else: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 - 1tail = m + n - 1while p1 >= 0 or p2 >= 0:if p1 == -1:nums1[tail] = nums2[p2]p2 -= 1elif p2 == -1:nums1[tail] = nums1[p1]p1 -= 1elif nums1[p1] > nums2[p2]:nums1[tail] = nums1[p1]p1 -= 1else:nums1[tail] = nums2[p2]p2 -= 1tail -= 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/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端后端结合:深度解析与实战策略

Web前端后端结合&#xff1a;深度解析与实战策略 在数字化时代的浪潮中&#xff0c;Web前端与后端的结合已成为构建高效、稳定且用户友好的网络应用的关键。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入探讨Web前端后端结合的重要性、挑战以及实施策略&am…

【安装笔记-20240616-Windows-Gpg4win 证书管理器】

安装笔记-系列文章目录 安装笔记-20240616-Windows-Gpg4win 证书管理器 文章目录 安装笔记-系列文章目录安装笔记-20240616-Windows-Gpg4win 证书管理器 前言一、软件介绍名称&#xff1a;Gpg4win主页官方介绍 二、安装步骤测试版本&#xff1a;Gpg4win 4.3.1下载链接安装界面…

网站的文章起到什么作用

1.便于用户了解产品服务 如果想要获得更多的用户访问或者转化率&#xff0c;那么网站就得需要高质量、高原创的文章&#xff0c;通过文章可以让用户更好的了解公司的产品和服务&#xff0c;用户会根据自己的需求去选择服务类型&#xff0c;从而可以给公司产生业务订单&am…

攻防演练之-网络安全工作机会大巡礼

书接上文&#xff0c;《网络安全攻防演练风云》专栏之攻防演练之-成功的钓鱼邮件溯源&#xff0c;这里。 午餐的时间到了&#xff0c;每天Nick团队的小伙伴都会到园区外的一家工作餐饭店就餐。这家餐厅是按照称重模式进行菜品选取的&#xff0c;因此种类是相对丰富的&#xff…

android studio 模拟器文件查找

android studio 模拟器文件查找 使用安卓模拟器下载文件后通常无法在系统硬盘上找到下载的文件&#xff0c;安卓 studio studio 其实提供了文件浏览工具&#xff0c;找到后可以直接使用 Android studio 打开 打开 Android studioview 菜单view > Tool Windows > Device…

直播中的美颜技术详解:视频美颜SDK的开发与应用

今天&#xff0c;笔者将深入探讨直播中的美颜技术&#xff0c;解析视频美颜SDK的开发与应用。 一、视频美颜技术概述 视频美颜技术主要通过实时处理视频流&#xff0c;对人脸进行优化和修饰&#xff0c;使直播画面更加美观。这些功能不仅提升了用户的直播体验&#xff0c;还极…

【django问题集】django.db.utils.OperationalError: (1040, ‘Too many connections‘)

一、报错内容 django.db.utils.OperationalError: (1040, Too many connections) 主要体现&#xff1a;就是请求不了后台&#xff0c;登录都登录不了。 二、代码优化 原生django配置的mysql连接是没有连接池的功能&#xff0c;会导致mysql连接创建过多导致连接数超过了mysql服…

国际化项目开发中关于时间的问题一

一、时间、时区、时间戳、UTC这些概念和关系 时间戳&#xff1a;不区分时区&#xff0c;表示自1970年1月1日00:00:00 UTC以来的秒数或毫秒数。 时间与时区关系&#xff1a;时区决定了本地时间与UTC时间的偏移量。本地时间 UTC时间 时区偏移 时区转换1&#xff1a;时间是分时…

Paragon NTFS for Mac 15软件下载及安装教程

简介&#xff1a; NTFS For Mac 15是首个支持Mac上读写NTFS外置存储设备解决方案 &#xff0c;解决mac不能读写外置让您更加简单直观的在Mac机上随意对NTFS文件修改、删除等操作。 安 装 包 获 取 地 址&#xff1a; Paragon Ntfs For Mac 15版&#xff1a; ​​https://sou…

Android出海实战:Firebase Analytics埋点

大家好&#xff0c;我是小编阿文。欢迎您关注我们&#xff0c;经常分享有关Android出海&#xff0c;iOS出海&#xff0c;App市场政策实时更新&#xff0c;互金市场投放策略&#xff0c;最新互金新闻资讯等文章&#xff0c;期待与您共航世界之海。 写在伊始 Google Analytics&…

二刷算法训练营Day30 | 回溯算法(6/6)

目录 详细布置&#xff1a; 1. 回溯总结 2. 332. 重新安排行程 3. 51. N 皇后 4. 37. 解数独 详细布置&#xff1a; 1. 回溯总结 回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#x…

时代巨兽!深度神经网络如何改变我们的世界?

深度神经网络 1、 简介1.1 定义深度神经网络1.2 深度学习的发展历程1.3 深度神经网络的应用领域 2、深度神经网络的基本原理2.1 神经元层2.1.1 神经元2.1.2 神经元层 2.2 前向传播2.3 反向传播2.4 激活函数2.4.1、作用2.4.2、常见激活函数2.4.3、选择激活函数的考虑 2.5 损失函…

AI 有感:智能体 = 提示词工程 + 大模型算力 + 插件类工具?

回顾 继这篇文章推出&#xff1a;怎么看 AI 大模型&#xff08;LLM&#xff09;、智能体&#xff08;Agent&#xff09;、知识库、向量数据库、知识图谱&#xff0c;RAG&#xff0c;AGI 的不同形态&#xff1f; 引起了很多粉丝朋友的反响&#xff0c;随着目前各大模型的发布以…

项目部署(前后端)

一&#xff1a;多环境概念&#xff1a; 借鉴来源&#xff1a;多环境设计_程序员鱼皮-多环境设计-CSDN博客 为什么需要多环境&#xff1a; 第一个例子&#xff1a;我们可以设想&#xff0c;我们肯定玩过王者荣耀&#xff0c;且王者荣耀也一直在不断更新&#xff0c;如果按我们…

短视频五大要素:成都科成博通文化传媒公司

短视频五大要素&#xff1a;揭秘成功视频的关键 在数字媒体时代&#xff0c;短视频已成为人们生活中不可或缺的一部分。无论是社交平台的日常分享&#xff0c;还是品牌营销的重要工具&#xff0c;短视频都以其短小精悍、内容丰富的特点赢得了广泛的关注和喜爱。然而&#xff0…

Java 和 Kotlin Lambda 表达式详解

1. 什么是 Lambda 表达式&#xff1f; Lambda 表达式是一种简洁的函数表达方式&#xff0c;可以把函数作为一个方法的参数&#xff0c;或者将代码块转换为数据传递。Lambda 表达式可以帮助减少样板代码&#xff0c;使代码更简洁、可读性更强。 2. Java Lambda 表达式 2.1 基…

9种编程语言的对比分析

在当今的软件开发领域&#xff0c;编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景&#xff0c;选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析&#xff0c;帮助读者了解它们的优缺点和适用场景。 Java 特点&…

freemarker 使用

首次使用freemarker遇到的全是坑,还好,各种问题,最终都解决了。芹菜加油 import com.lowagie.text.pdf.BaseFont; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xhtmlrenderer.pdf.ITextRenderer;import java.io.Byte…

智能化软件开发微访谈·第三十一期 代码大模型训练、微调与增强

CodeWisdom “智能化软件开发沙龙是由CodeWisdom团队组织的围绕智能化软件开发、数据驱动的软件开发质量与效能分析、云原生与智能化运维等相关话题开展的线上沙龙&#xff0c;通过微信群访谈交流等线上交流方式将学术界与工业界专家学者汇聚起来&#xff0c;共同分享前沿研究进…

微软:Windows 11“跨设备服务“CPU占用率过高的错误确实存在

当某些后台任务导致电脑的 CPU 占用率过高时&#xff0c;通常意味着工作负载存在漏洞&#xff0c;从而导致其行为失常&#xff0c;而某些 Windows 进程或服务往往也是罪魁祸首。本月&#xff0c;Windows 用户和业内人士发现他们的系统出现了一些问题&#xff0c;通过使用方便的…