LeetCode简单题之合并两个有序数组

news/2025/3/15 9:11:05/

题目

给你两个按 非递减顺序 排列的整数数组 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 中。
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-10^9 <= nums1[i], nums2[j] <= 10 ^9
进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?
来源:力扣(LeetCode)

解题思路

  这个题给出的输入非常的友好。给了足够多的信息,这个题其实就是简单的两个归并段归并排序,可以直接将nums2拼接到num1的末尾进行排序。

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."""if n!=0:nums1[m:]=nums2nums1.sort()

在这里插入图片描述
  但这并不是十分好的方法,没有完全利用已经有序的这个大好条件,如果是快速排序可能需要O((n+m)log(n+m))的时间复杂度,当然也可以用希尔排序,可能情况会好一些。对于这个题目的优化如果仅仅按照正常的归并来进行的话,会导致num1中大量元素的移动,为了避免这种情况我们可以建立一个新的临时数组,当然这便增加了空间复杂度;还有另外一种方案就是两个数组从后往前对比,这样的话得益于num1良好的输入会方便不少。

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."""if m==0:nums1[:]=nums2elif n!=0:i=m-1  #nums1的指针j=n-1  #nums2的指针k=m+n-1  #总体排序的指针while j>=0: if nums2[j]>=nums1[i]:  #将nums2中的元素插入nums1中nums1[k]=nums2[j]j-=1k-=1continueelse:nums1[k]=nums1[i]   #将nums1中的元素放置在最终位置上i-=1k-=1if i==-1:   #表示当前nums2中未参加比较的元素均小于nums1中的第一个元素nums1[0:k+1]=nums2[0:j+1]break

在这里插入图片描述
  理论上来说优化过后程序的运行时间应该降低,出现这种情况一个可能是因为个人的代码问题或者测试例子中数组往往较短,另外一个就是python的内嵌函数优化的已经非常好了。


http://www.ppmy.cn/news/606214.html

相关文章

二叉树层序遍历相关题目

前言102.二叉树的层序遍历题目描述前提知识代码107二叉树的层序遍历II题目描述代码199.二叉树的右视图题目描述思路代码637.二叉树的层平均值题目描述思路代码429.N叉树的层序遍历题目描述思路代码515.在每个树行中找最大值题目描述思路代码116.填充每个节点的下一个右侧节点指…

pytorch学习笔记(十二):详解 Module 类

Module 是 pytorch 提供的一个基类&#xff0c;每次我们要 搭建 自己的神经网络的时候都要继承这个类&#xff0c;继承这个类会使得我们 搭建网络的过程变得异常简单。 本文主要关注 Module 类的内部是怎么样的。 初始化方法中做了什么def __init__(self): self._backend thnn…

LeetCode简单题之只出现一次的数字

题目 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1 示例 2…

小芯片技术分析

小芯片技术分析 芯粒&#xff08;Chiplet&#xff09;是在2015年Marvell创始人之一周秀文(Sehat Sutardja)博士曾提出Mochi(Modular Chip&#xff0c;模块化芯片)架构的概念&#xff0c;这是芯粒最早的雏形。 几十年来&#xff0c;半导体行业一直按照摩尔定律的规律发展着&…

Linux学习(5)——远程登录到Linux服务器

✨Linux——远程登录到Linux服务器⛱️应用场景⛱️远程登录Linux-Xshell7&#x1f355;&#x1f355; 介绍&#x1f355;&#x1f355;Xshell7的下载-安装-配置-使用&#x1f355;&#x1f355;Xshell连接虚拟机⛱️远程上传下载文件Xftp7&#x1f355;&#x1f355;基本介绍&…

LeetCode简单题之排列硬币

题目 你总共有 n 枚硬币&#xff0c;并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯&#xff0c;其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n &#xff0c;计算并返回可形成 完整阶梯行 的总行数。 示例 1&#xff1a; 输入&…

集成电路技术市场产业链

集成电路技术市场产业链 集成电路英语&#xff1a;integrated circuit&#xff0c;缩写作 IC&#xff1b;或称微电路&#xff08;microcircuit&#xff09;、微芯片&#xff08;microchip&#xff09;、晶片/芯片&#xff08;chip&#xff09;在电子学中是一种将电路&#xff0…

LeetCode简单题之找到所有数组中消失的数字

题目 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,3,1] 输出&#xff1a;[5,6] 示例…