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

news2024/11/24 14:12:28

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/

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

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

相关文章

Android ViewModel实现和原理

ViewModel实现和原理 前言1. 使用1.1 gradle准备1.2 模拟场景1.3. LiveData和ViewModel1.4 更新数据 2. 原理与源码解读2.1 添加观察者2.2 setValue2.3 post 参考资料 前言 ViewModel的主要基于观察者的设计模式&#xff0c;他主要分为两个部分&#xff1a; 提供者Provider&a…

Codesys 获取系统年、月、日、时、分、秒、星期几 +解决时区问题+ ST语言编程实现代码

一、 效果如图所示 二、功能说明 发现获取的时间比北京时间多一个时区&#xff08;8个小时&#xff09;&#xff0c;解决时区问题获取时间后&#xff0c;单独把年月日时分秒提取出来&#xff0c;单独保存在变量中获取星期几&#xff0c;保存在变量中 三、Codesys用ST语言实现…

【MySQL统计函数count详解】

MySQL统计函数count详解 1. count()概述2. count(1)和count(*)和count(列名)的区别3. count(*)的实现方式 1. count()概述 count() 是一个聚合函数&#xff0c;返回指定匹配条件的行数。开发中常用来统计表中数据&#xff0c;全部数据&#xff0c;不为null数据&#xff0c;或…

【C++】模板初级

【C】模板初级 泛型编程函数模板函数模板的概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板格式类模板的实例化 泛型编程 当我们之前了解过函数重载后可以知道&#xff0c;一个程序可以出现同名函数&#xff0c;但参数类型不同。 //整型 voi…

如何获得一个Oracle 23ai数据库(vagrant box)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 前面我博客介绍了3种方法&#xff1a; Virtual ApplianceRPM安装Docker 今天介绍最近新出的一种方法&#xff0c;也是我最为推荐的…

如何使用任意浏览器远程访问本地搭建的Jellyfin影音平台

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

Linux---系统的初步学习【项目一:Linux操作系统的安装与配置】

项目一 Linux操作系统的安装与配置 1.1 项目知识准备 1.1.1 操作系统是什么&#xff1f; ​ 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理硬件、决定程序运行的优先次序、管理文件系统等…

遗传算法浅理解

1. 什么是遗传算法&#xff1f; ​ 遗传算法&#xff0c;又称为 Genetic algorithm(GA)Genetic algorithm(GA)。其主要思想就是模拟生物的遗传与变异。它的用途非常广泛&#xff0c;可以用于加速某些求最大或者最小值的算法&#xff08;换句话说就是加速算法收敛&#xff0c;最…

月球全月地质图和4.5亿像素月面标注地图

嫦娥六号都在月球挖到土特产了&#xff0c;那你知道月球到底长什么样子吗&#xff1f; 现在我们就为你分享一下月球的全月地质图&#xff0c;以及4.5亿像素月面带标注的地图&#xff0c;你可以在文末查看该数据的领取方法。 月球全月地质图 对于月球的探索&#xff0c;美国和…

如何高效使用大型语言模型 LLMs 初学者版本 简单易上手

第一条也是最重要的一条规则是 永远不要要求LLM提供你无法自己验证的信息, 或让它完成你无法验证其正确性的任务。 唯一例外的情况是那些无关紧要的任务&#xff0c; 例如&#xff0c;让大型语言模型提供公寓装修灵感之类的是可以的 。 首先请看两个范例 不佳示范&#xff1a…

SAP 采购订单 价格 条件权限控制 授权账户

采购订单 价格 条件权限控制 授权账户 1、事务代码 me21/22/23/N 2、权限对像如下几个 M_BEST_BSA/EKG/EKO/WRK ACTVT 09 SELECT DISTINCT a.* FROM ( SELECT DISTINCT agr_users.uname FROM agr_1251INNER JOIN agr_users ON agr_1251.agr_name agr_users.agr_name AND…

智能制造uwb高精度定位系统模块,飞睿智能3厘米定位测距芯片,无人机高速传输

在科技日新月异的今天&#xff0c;定位技术已经渗透到我们生活的方方面面。从手机导航到自动驾驶&#xff0c;再到无人机定位&#xff0c;都离不开精准的定位系统。然而&#xff0c;随着应用场景的不断拓展&#xff0c;传统的定位技术如GPS、WiFi定位等&#xff0c;因其定位精度…

WPF 深入理解一、基础知识介绍

基础知识 本系列文章是对个人 B站 up 微软系列技术教程 记录 视频地址 https://www.bilibili.com/video/BV1HC4y1b76v/?spm_id_from333.999.0.0&vd_source0748f94a553c71a2b0125078697617e3 winform 与 wpf 异同 1.winform 项目结构 编辑主要是在 Form1.cs(页面)&#…

Go基础编程 - 09 - 通道(channel)

通道&#xff08;channel&#xff09; 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇&#xff1a;结构体 Go语言的并发模式&#xff1a;不要通过共享内存来通信&#xff0c;而应该通过通信来共享内存。 Go语言…

Spring框架永远滴神之SpringAI玩转大模型

文章目录 一、SpringAI简介1.什么是SpringAI2.SpringAI支持的大模型类型&#xff08;1&#xff09;聊天模型&#xff08;2&#xff09;文本到图像模型&#xff08;3&#xff09;转录&#xff08;音频到文本&#xff09;模型&#xff08;4&#xff09;嵌入模型&#xff08;5&…

报错:C1189#error: The <experimental/filesystem> header providing 解决方案

今天开发过程中&#xff0c;需要使用文件系统experimental/filesystem&#xff0c;报错C1189#error: The &#xff1c;experimental/filesystem&#xff1e; header providing &#xff0c;通过以下解决方案&#xff0c;成功运行程序。 目录 一、打开项目下的属性 二、选择C/…

离散数学-代数系统证明题归类

什么是独异点&#xff1f; 运算 在B上封闭&#xff0c;运算 可结合&#xff0c;且存在幺元。 学会合理套用题目公式结合律 零元&#xff1f; 群中不可能有零元 几个结论要熟记&#xff1a; 1.当群的阶为1时&#xff0c;它的唯一元素视作幺元e 2.若群的阶大于1时&#xff0c;…

PV180R1K1T1NMMC派克通轴传动结构柱塞泵

PV180R1K1T1NMMC派克通轴传动结构柱塞泵 派克柱塞泵的结构组成部分&#xff1a;柱塞、手把、斜盘、压盘、滑履、泵体、配油盘、传送轴。其优点如下&#xff1a; 1、结构紧凑耐用&#xff0c;具有灵活的安装接口 2、安静的工作 3、效率高 4、降低功耗和减少发热 5、具有“…

视角概述( Perspective 业务分析篇)

背景 在业务分析工作中使用透视图来提供对特定于计划上下文的任务和技术的关注。大多数提案可能涉及一个或多个视角。视角主要包括&#xff1a; •敏捷•商业智能•信息技术•商业架构&#xff0c;以及业务流程管理。这些视角并不代表业务分析实践的所有可能视角。 任何给定…

SpringMvc—域对象共享数据和视图

一、向request域创建对象 先创建首页&#xff1a; 在testController这个类中&#xff1a; package com.pon.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller public class test…