LeetCode面试150——88合并两个有序数组

本地部署 pyvideotrans(视频翻译配音工具) 语音识别选择faster-whisper(本地),模型选择预先下载并保存的medium,然后选择好要处理的视频以及保存到的位置,这里我选择了一个名为why not的英文演讲视频,保存在桌面_vedio_out文件下。将附件中faster-medium.7z 和 faster-small.7z解压到项目中的models目录下, 解压后,目录中应该存在 models--Systran--faster-whisper-small。en.m4a|.wav = 原始视频中的音频文件(包含所有背景音和人声) 阅读详情

LeetCode面试150——88合并两个有序数组

题目难度:简单

默认优化目标:最小化平均时间复杂度。

Python默认为Python3。

1 题目描述

给你两个按 非递减顺序 排列的整数数组 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

  • -109 <= nums1[i], nums2[j] <= 109

进阶:你可以设计实现一个时间复杂度为 O(m + n) 的算法解决此问题吗?

2 题目解析

输入是两个非递减排序的数组,输出是合并这两个数组后的非递减排序的数组。

从输入输出来看,必然涉及到数组的合并操作、排序操作。其中,排序操作是对时间复杂度影响最大的。

注意输入的数组已经是按非递减排序好了的,要降低算法的时间复杂度可以从这入手。用双指针就是个不错的选择,因为有两个非递减排序的数组。

从注意中看,要求用nums1返回结果。另外,nums1的初始长度为m+n,m是nums1中应该合并的元素个数,n为nums1中元素为零的个数,也是nums2的长度。

3 算法原理及程序实现

3.1 先合并后排序

直接将两个数组合并在一起,然后再排序。时间复杂度等于所选用排序算法的时间复杂度。例如使用快排,则平均时间复杂度为O((m+n)\log(m+n)),平均空间复杂度为O(\log(m+n))​

C++代码实现

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        for(int i=0;i<n;i++){
            nums1[m+i]=nums2[i];
        }
        sort(nums1.begin(),nums1.end());
    }
};

Python代码实现

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.2 双指针

题目描述中的非递减排序还没用到。我们可以使用双指针方法。一个指针指向nums1的第一个元素,另一个指针指向nums2的第一个元素。这样依次取数组中的元素,存入一个中间数组中,最后再更新nums1就行了。平均时间复杂度为O(m+n),平均空间复杂度为O(m+n)。

C++代码实现

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int pointer1=0,pointer2=0;//指针,1指向nums1,2指向nums2
        int temp[m+n];//中间数组
        int cur;//接收指针指向元素的更小的那个值
​
        while(pointer1<m ||pointer2<n){//两个数组都都读完才停止循环
            if(pointer1==m){//nums1读完,接着读nums2
                cur=nums2[pointer2++];
            }else if(pointer2==n){//nums2读完,接着读nums1
                cur=nums1[pointer1++];
            }else if(nums1[pointer1]<nums2[pointer2]){//nums1中指向的元素比nums2中指向的小,nums1先放入
                cur=nums1[pointer1++];
            }else{//否则,nums2先放
                cur=nums2[pointer2++];
            }
            temp[pointer1+pointer2-1]=cur;//给中间数组赋值
        }
        for(int i=0;i<m+n;i++){
            nums1[i]=temp[i];//用中间数组更新nums1
        }
​
    }
};

Python代码实现

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.
        """
        pointer1,pointer2=0,0
        temp=[]
​
        while pointer1<m or pointer2<n:
            if pointer1 == m:
                temp.append(nums2[pointer2])
                pointer2+=1
            elif pointer2 == n:
                temp.append(nums1[pointer1])
                pointer1+=1
            elif nums1[pointer1]<nums2[pointer2]:
                temp.append(nums1[pointer1])
                pointer1+=1
            else:
                temp.append(nums2[pointer2])
                pointer2+=1
            
        nums1[:]=temp
​
​

3.3 逆向双指针

进一步,nums1的长度为m+n,也就是说后面有n个空余位置。我们能不能利用这些空余位置,从而节省开辟中间数组的存储空间呢?

我们假设一个极端情况,先全部放nums2中的元素,即nusm2中的最大的元素比nums1中最小的元素小。那就是说,nums2中的n个元素。如果我们从后面放,刚好填满空闲位置。只要把指针的位置从指向数组的第一个元素改为指向数组的非零值的最后一个元素,就可以不用中间数组来存放元素值了。

将双指针的代码稍加修改即可实现功能。因为逆向,所以运算全部要反过来。++变--,<变>。指针指向也从0分别变为m-1,n-1。

平均时间复杂度O(m+n),平均空间复杂度O(1)。

C++代码实现

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int pointer1=m-1,pointer2=n-1;//指针,1指向nums1的末尾,2指向nums2末尾
        int cur;//接收指针指向元素的更小的那个值
        int tail=m+n-1;
​
        while(pointer1>=0 ||pointer2>=0){//两个数组都都读完才停止循环
            if(pointer1==-1){//nums1读完,接着读nums2
                cur=nums2[pointer2--];
            }else if(pointer2==-1){//nums2读完,接着读nums1
                cur=nums1[pointer1--];
            }else if(nums1[pointer1]>nums2[pointer2]){//nums1中指向的元素比nums2中指向的大,nums1先放入
                cur=nums1[pointer1--];
            }else{//否则,nums2先放
                cur=nums2[pointer2--];
            }
            nums1[tail--]=cur;
        }
       
​
    }
};

Python代码实现

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

参考资料

力扣面试经典150题

力扣官方题解

36、R语言中的回归模型与机器学习算法 本文介绍了R语言中多种回归模型和机器学习算法,包括Cox回归模型、数据平滑方法(如样条函数、多项式曲面拟合和核平滑)以及回归树模型等。重点讲解了这些方法的实现函数、参数说明以及实际应用示例,如使用`coxph`进行生存分析、使用`spline`和`smooth.spline`进行数据平滑处理、使用`loess`和`locpoly`进行非参数回归分析,以及使用`rpart`构建和可视化回归树。此外,还涉及了模型评估与优化策略,如数据拆分、交叉验证和树的修剪。通过这些方法,可以更好地处理复杂数据集并提升模型性能 阅读详情

相关推荐

STM32多模式智能小车状态机设计与中断优先级实践

在嵌入式实时系统中,状态机是实现多任务协同与功能切换的核心范式。其本质是通过有限状态集合、明确转移条件和确定性动作,构建可预测、易维护的控制逻辑。基于STM32等资源受限MCU时,需兼顾状态调度效率、中断并发安全与硬件资源约束。关键技术价值体现在:提升系统模块解耦度、支持物理按键与蓝牙双源触发、保障实时响应不丢帧。典型应用场景包括智能小车多模运行(循迹、避障、遥控、定距跟随等)、工业设备工作模式切换及IoT终端低功耗状态管理。本文以STM32F103C8T6平台为例,深入解析全局模式变量设计、双通道状态切换

weixin_42509888的博客 93

leetcode 88. 合并两个有序数组(python3实现)

合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nu...

算法探索之路 426

手把手教你理解ARM SoC中的PPU:电源管理IP的配置与实战避坑指南

本文深入解析ARM SoC中的PPU(Power Policy Unit)电源管理IP,提供详细的配置指南与实战避坑技巧。从PPU基础架构、寄存器配置到与PCSM的协同工作,全面介绍如何优化电源管理策略,解决常见配置误区,并分享高级调试与性能优化方法,助力工程师提升低功耗SoC设计效率。

weixin_28693447的博客 479

Python 合并两个有序数组

数组整体进行排序即可。

u011699626的博客 642

Mamba与iTransformer融合:时间序列预测中的曼巴注意力机制创新实践

本文探讨了Mamba与iTransformer融合在时间序列预测中的创新实践,重点介绍了曼巴注意力机制的设计与优势。通过双路径信息流设计,该方案在保持O(n)复杂度的同时,显著提升了预测精度和训练效率。实验证明,混合架构在电力负荷、气象数据等多变量长序列场景中表现优异,预测误差降低至0.083,内存占用仅4.2GB。

weixin_29292535的博客 219

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 557

LC 合并两个有序数组 python解答 15% 46%

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_42375356的博客 2926

人工智能100问☞第5问:什么是AI三要素?

人工智能的核心三要素是​​数据、算法和算力​​,分别作为AI的“燃料”、“大脑”和“动力”,三者协同驱动智能系统的学习、推理与决策能力。

bjdx_001的博客 1991

力扣刷题(python)50天——第二十五天:合并两个有序数组

力扣刷题(python)50天——第二十五天:合并两个有序数组 题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: num...

weixin_44568780的博客 278

手把手教你用EG2153搭建开关电源:SOP-8封装驱动芯片的5个设计技巧

本文详细介绍了使用EG2153自振荡半桥驱动芯片搭建开关电源的五个核心设计技巧。内容涵盖从深入理解芯片工作机制、频率编程计算误区、SOP-8封装的热管理方案,到死区时间评估与外部保护电路设计,以及实战调试与故障排查指南,旨在帮助工程师实现稳定可靠的小功率电源设计。

weixin_29200485的博客 377

Android系统开机时间分析与优化指南

本文系统阐述了Android开机时间优化的全流程技术方案。首先详细解析了从电源键按下到桌面显示的完整启动流程及关键事件序列,然后介绍了秒表计时、日志分析和自动化脚本三种测量方法。重点从底层和上层两个维度提出了具体优化措施:底层包括编译器优化、内核驱动裁剪和日志精简;上层涵盖系统服务参数调整、应用预优化和功能组件精简。最后提供了验证工具和方法,并强调优化需要在性能、功耗和功能间取得平衡。通过这套系统化方案,可有效提升Android设备的开机速度与用户体验。

学无止境 352

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

88. 合并两个有序数组-6种解法

算法部落 524

YOLOv8【第十三章:模型压缩与极致优化篇·第4节】LAMP 剪枝算法——无需超参的自动化剪枝策略!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 5642

力扣(leetcode)面试经典150题——88. 合并两个有序数组

给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。需要合并 [1,2,3] 和 [2,5,6]。合并结果是 [,2,,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

qq_36748747的博客 380

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

力扣面试150题 | 88.合并两个有序数组

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。输入:nums1 = [0], m = 0, nums2 = [1], n = 1。输入:nums1 = [1], m = 1, nums2 = [], n = 0。解释:需要合并 [1,2,3] 和 [2,5,6]。解释:需要合并的数组是 [] 和 [1]。输出:[1,2,2,3,5,6]

方可申不翘二郎腿的博客 747

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

weixin_49946504的博客 1139

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

合并两个有序数组

bblb的博客 1177

力扣面试经典150题-88. 合并两个有序数组

摘要: 本文探讨了合并两个有序数组的算法问题,要求将非递减排列的nums2合并到nums1中,并保持有序。初始思路是将nums2直接拼接到nums1末尾后排序,但时间复杂度较高(O((m+n)log(m+n)))。优化方案采用逆向双指针法:从两个数组末尾开始比较,将较大元素填入nums1的尾部,避免数据移动,确保时间复杂度为O(m+n)。最终处理剩余元素,若nums2未遍历完则直接按序填充。此方法高效且节省空间,通过示例验证了其正确性。

yisaxieer的博客 382

LeetCode面试经典150题—合并两个有序数组—LeetCode88

因为两数组是有序的,所以可以从两个数组的最左边(或者最右边),陆续比较哪个数组的边界元素更小(或更大)依次取出来扫到目标数组即可。个元素都是空白的,所以从右往左比较,不会导致元素顺移问题。数组上原地排序,如果从左往右比较,会导致新元素插入。原来的元素需要依次右移,复杂度较高。,意思是最好不用额外空间实现。关键点1:两个数组是。

weixin_42606421的博客 529

Leetcode 面试150题 88.合并两个有序数组 简单

官网的双指针,自己的麻烦地方在于没有想到用一个while循环即可实现,自己想的是,判断完了该取哪个数组的值后,在数组中用while连续取值,但是应该是一个while,在这个while里面觉得从哪个数组取值,自己的思路和官方的思路,顺序相反。结果是 [1],nums1 中的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。合并结果是 [1,2,2,3,5,6],其中斜体加粗标注的是 nums1 中的元素。的放入最后结果数组result中,再用双指针,可以直接使用双指针。中,使合并后的数组同样按。

buyaotutou的博客 555

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

合并两个有序数组

qq_29536773的博客 348

力扣经典面试150题——88.合并两个有序数组

本文介绍了合并两个有序数组的算法。给定两个非递减排列的数组nums1和nums2,其中nums1预留了足够空间,要求将nums2合并到nums1中并保持有序。采用双指针法,比较两个数组元素并逐个选择较小值存入临时数组,最后将剩余元素追加。时间复杂度为O(m+n)。示例代码展示了具体实现过程,包括边界条件处理。该解法高效且直观,适用于各类有序数组合并场景。

weixin_51396342的博客 520

面试经典150题[001]:合并两个有序数组(LeetCode 88)

你有两个已经排好序的数组: * nums1:前面是有效数字,后面是空位(0 占位),用来放另一个数组的元素。 * nums2:完整的、也是排好序的数组。 目标是把 nums2 的元素合并到 nums1 中,并且最终 nums1 还是升序。

YoungHong1992 400

【LeetCode 面试经典150题】88. Merge Sorted Array 合并两个有序数组

这个问题的关键在于从后向前合并两个数组,这样可以避免在合并时覆盖nums1中未处理的元素。由于nums1的大小足以容纳两个数组合并后的所有元素,因此可以在不需要额外空间的情况下完成合并。通过从两个数组的末尾开始比较,可以确保在合并时不会丢失任何元素,并且每个元素只需要移动一次。当其中一个数组的元素全部被合并后,如果另一个数组还有剩余元素,这些元素可以直接复制到nums1的相应位置。public:// 合并两个有序数组nums1, nums2// index 指向nums1数组末尾。

qq_43513394的博客 1126

力扣面试150题#1 88.合并两个有序数组(java)

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

m0_64251022的博客 625

【力扣面试经典150题】day1 88. 合并两个有序数组

给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。需要合并 [1,2,3] 和 [2,5,6]。合并结果是 [,2,,5,6] ,其中斜体加粗标注的为 nums1 中的元素。[1]

crystalkkkk的博客 184
上一篇: Markdown数学公式详解
下一篇: LeetCode面试150——27移除元素
沈小农学编程
博客等级 码龄4年 735粉丝 52原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值