【Leetcode|#88.合并两个有序数组】

题目

给你两个按非递减顺序排列的整数数组nums1nums2,另有两个整数 m 和 n ,分别表示nums1nums2中的元素数目。
请你合并nums2nums1中,使合并后的数组同样按非递减顺序排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为0 ,应忽略。nums2 的长度为n。

solution.1 合并之后再进行快排

快排的实现方式和原理

  • 先手写一个快速排序的方法,使用了递归的方式,这里需要注意的是,pivot应该在if语句内部进行赋值,否则在nums1和nums2合并之后只有两个元素的情况下会有报错(超出索引,地址访问报错)。
  • 然后我们在merge方法中用遍历的方式,将nums2插入到nums1的末尾,然后使用快速排序。

时间复杂度:
由于我们是对两个数组先进行合并然后再快速排序,因此,长度为m+n,所以时间复杂度为(m+n)log(m+n)。
空间复杂度:
由于快速排序是一种原地排序方式(并没有创建新的数组),因此空间复杂度套用快速排序的公式即log(m+n)。

class Solution {
public:void quickSort(vector<int>& vi, int lo, int hi){int pivot;int i = lo;int j = hi;if (lo < hi){pivot = vi[lo];while (i != j){while (vi[j] >= pivot && j > i){j--;}while (vi[i] <= pivot && j > i){i++;}if(i<j){swap(vi[i], vi[j]);}}swap(vi[lo], vi[i]);quickSort(vi, lo, i-1);quickSort(vi, i+1, hi);}}void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i = 0;i != n;i++){nums1[m+i] = nums2[i];}quickSort(nums1, 0, m+n-1);}
};

solution.2 双指针

  • 使用两个分别指向nums1和nums2数组末端的指针(由于题目的设置是nums1后面补齐了0,为了给nums2的元素预留位置,因此这里的指向nums1数组末端的指针的真正含义是指向nums1最后一个不为0的值的位置),然后我们分别比较两个位置的元素的大小,从m+n-1的位置开始从后往前补齐元素。

时间复杂度:
即移动数据的次数,最多移动m+n次,即时间复杂度为m+n。
空间复杂度:
我们并没有创建新的数组而是在原地进行操作,因此空间复杂度为1。

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 = m-1;int p2 = n-1;int p3 = m + n - 1;int cur = 0;while(p1 >= 0|| p2 >= 0){if(p1 == -1){cur = nums2[p2--];}else if(p2 == -1){cur = nums1[p1--];}else if(nums1[p1] > nums2[p2]){cur = nums1[p1--];}else{cur = nums2[p2--];}nums1[p3--] = cur;}}
};

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

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

相关文章

嵌入式MCU BootLoader开发配置详细笔记教程

目录 一、BootLoader基础 二、BootLoader原理及配置 三、BootLoader程序 bootloader.h bootloader.c 四、Application1 用户程序 application1.h application1.c 五、Application2 用户程序 application2.h 六、程序运行效果 七、工程文件Demo 一、BootLoader基础 …

HTTP Keep-Alive的作用

作用&#xff1a;Keep-Alive&#xff1a;使客户端到服务器端的连接持续有效&#xff0c;当出现对服务器的后继请求时&#xff0c; Keep-Alive功能避免了建立或者重新建立连接。Web服务器&#xff0c;基本上都支持HTTP Keep- Alive。 缺点&#xff1a;对于提供静态内容的网站来…

Unity 中消息提醒框

Tooltip 用于ui布局 using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI;[ExecuteInEditMode()] // 可以在编辑模式下运行public class Tooltip : MonoBehaviour {public TMP_Text header; // 头部文本publi…

MCU最小系统的电源模块设计和复位模块的设计

最小操作系统就是一个电路&#xff0c;这个电路里面必须要的东西&#xff08;如人需要喝水吃饭温度等情况&#xff0c;才能或者&#xff09; 现在我们要解决这三个问题 这里V开头的&#xff0c;都是电源管脚 这里解释一下&#xff1a; 这里要注意哪些是电路电压&#xff0c;哪…

简历上写熟悉Linux下常用命令?直接寄

大家写简历技术栈时&#xff0c;都觉得越多越好&#xff0c;其中一条&#xff0c;熟悉Linux下常用命令&#xff1f;其实开发中Linux不是必备考点&#xff0c;除了运维&#xff0c;真正用的多的仅仅cd ls mkdir等&#xff0c;但当面试官问到上面命令时&#xff0c;是不是就傻眼了…

Android14音频进阶之Perfetto高级调试技巧(六十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

【网安小白成长之路】6.pikachu、sql-labs、upload-labs靶场搭建

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

oracle 19c 主备 补丁升级19.22

补丁升级流程 备库升级 备库备份$ORALCE_HOME du -sh $ORACLE_HOME ​​​​​​​ 备份目录将dbhome_1压缩 cd $ORACLE_HOME cd .. Ls tar -cvzf db_home.tar.gz db_home_1 /opt/oracle/product/19c ​​​​​​​​​​​​​​ 关闭监听关闭数据库查看sq…

conda搭建与管理python环境

conda搭建与管理python环境.md Anaconda下载地址Miniconda下载地址Linux下安装1.执行安装2.查看可安装的python版本3.创建环境4.激活环境5.安装python的工具包5.退出环境6.删除指定的环境7.设置默认的环境 Window下安装1.执行安装2.配置环境变量3.检查是否安装成功4.通过conda配…

计算机网络 实验指导 实验17

实验17 配置无线网络实验 1.实验拓扑图 Table PC0 和 Table PC1 最开始可能还会连Access Point0&#xff0c;无影响后面会改 名称接口IP地址网关地址Router0fa0/0210.10.10.1fa0/1220.10.10.2Tablet PC0210.10.10.11Tablet PC1210.10.10.12Wireless互联网220.10.10.2LAN192.16…

[Kubernetes[K8S]集群:Slaver从节点初始化和Join]:添加到主节点集群内

文章目录 操作流程&#xff1a;上篇主节初始化地址&#xff1a;前置&#xff1a;Docker和K8S安装版本匹配查看0.1&#xff1a;安装指定docker版本 **[1 — 8] ** [ 这些步骤主从节点前置操作一样的 ]一&#xff1a;主节点操作 查看主机域名->编辑域名->域名配置二&#x…

C++ typeid运算符介绍

在 C 中&#xff0c;typeid() 是一个运算符&#xff0c;用于获取表达式的类型信息。typeid() 运算符在 C 中是一个强大的工具&#xff0c;可以用于获取对象的类型信息、类型比较、多态类型判断、异常处理以及类型转换安全检查等场景中。 1. 类型比较&#xff1a; 可以使用 ty…

数据库系统工程师笔记(一)计算机系统

文章目录 一、计算机系统1.1运算器1.2控制器1.3指令1.4存储器与总线1.5输入输出技术1.6计算机软件程序数据相关文档。1.7操作数1.8计算机硬件的典型结构1.9CPU由运算器和控制器组成1.10指令执行的过程1.11CPU的基本功能1.12计算机体系结构和计算机组成的区别1.13计算机体系结构…

【uniapp】vscode安装插件、ts校验、允许json文件注释

1、vscode安装的插件&#xff1a; uni-create-viewuni-hlperuniapp小程序扩展 2、ts校验 安装插件&#xff1a; pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types配置tsconfig.json {"extends": "vue/tsconfig/tsconfig.json","compi…

Python将相机图像采集的数据写入Redis

Python将相机图像采集的数据写入Redis 将传感器或相机采集的结构化和非结构化数据写入Redis数据库&#xff0c;本示例使用Python的Redis库&#xff0c;展示了如何将结构化数据&#xff08;如传感器读数&#xff09;和非结构化数据&#xff08;如相机拍摄的图像&#xff09;分别…

大家都在用的一款高颜值免费在线SCI绘图工具~~~

ImageGP从2017年推出后&#xff0c;稳定运行7年&#xff0c;因其使用简单方便&#xff0c;深受广大朋友们喜欢。 独立IP访问60万次&#xff0c;日均使用1000次。 如果您对编程不熟悉&#xff0c;使用ImageGP可以快速出图。 只需轻轻点2两下&#xff0c;下面的美图就出来了 如果…

系统架构最佳实践 -- 金融企业的资损防控

一、资损产生的原因 由于支付行业的特殊性与复杂性&#xff08;主要处理资金相关业务&#xff09;&#xff0c;支付公司处于资损的风口浪尖&#xff0c;最容易发生资损&#xff0c;可以说资损风险无处不在。 常规来说&#xff0c;资损原因主要可以分为以下三类&#xff1a; 1…

模拟动态加载网页数据Selenium,Puppeteer,WebDriver,Requests-HTML

模拟动态加载网页数据&#xff0c;你可以使用以下工具&#xff1a; Selenium&#xff1a;Selenium是一个用于Web应用程序测试的工具&#xff0c;它可以模拟用户在浏览器上的操作&#xff0c;包括点击、滚动、填写表单等。因此&#xff0c;它也可以用于爬取那些动态加载内容的网…

软考128-上午题-【软件工程】-白盒测试

一、白盒测试&#xff08;结构测试&#xff09; 白盒测试也称为结构测试&#xff0c;根据程序的内部结构和逻辑来设计测试用例&#xff0c;对程序的路径和过程进行测试&#xff0c;检查是否满足设计的需要。 白盒测试常用的技术是&#xff1a;逻辑覆盖、循环覆盖和基本路径测…

redis-plus-plus的安装与使用

本文参考自 redis-plus-plus 官方文档 一、安装 因为redis-plus-plus是基于hiredis封装的&#xff0c;所以需要先安装hiredis&#xff1b; 第一步&#xff1a;安装hiredis # 使用git下载源代码 git clone https://github.com/redis/hiredis.git # 进入源代码主目录 cd hired…