合并两个有序数组

合并两个有序数组

示例 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 中。

逆向双指针代码:

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m-1,p2 = n-1;int tail = m+n-1;int cur;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 if(nums1[p1]<nums2[p2]){cur = nums2[p2--];}else{cur = nums1[p1--];}nums1[tail--]=cur;}}
}

GPT的思路

国内使用地址点我跳转

我们可以使用双指针法从后向前遍历,避免将已经排序的数组打乱。这个方法的核心思路是从 nums1 的末尾开始填充较大的元素,因为末尾是用零填充的空闲区域,这样我们可以避免覆盖 nums1 的有效元素。

以下是实现的步骤:

  1. 定义两个指针,分别指向 nums1nums2 有效元素的末尾。
  2. 比较两个数组中的当前元素,将较大的元素放到 nums1 的末尾。
  3. 移动相应的指针,继续填充剩余的元素。
  4. 如果 nums2 中还有剩余元素没有处理完(即 nums1 中的元素已经全部处理完),就直接将 nums2 的元素放入 nums1

下面是 Java 代码的实现:

public class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {// 初始化三个指针,分别指向 nums1 和 nums2 的末尾,以及合并后数组的末尾int p1 = m - 1;int p2 = n - 1;int p = m + n - 1;// 从后往前遍历,比较 nums1 和 nums2 的元素while (p1 >= 0 && p2 >= 0) {if (nums1[p1] > nums2[p2]) {nums1[p] = nums1[p1];p1--;} else {nums1[p] = nums2[p2];p2--;}p--;}// 如果 nums2 还有剩余元素,直接填入 nums1while (p2 >= 0) {nums1[p] = nums2[p2];p--;p2--;}}
}

详细解释:

  1. 指针的初始化

    • p1 指向 nums1 中最后一个有效元素,即 m - 1
    • p2 指向 nums2 中最后一个元素,即 n - 1
    • p 指向 nums1 中最后一个位置,即 m + n - 1
  2. 比较元素并填充

    • p1p2 都没有越界的情况下,比较 nums1[p1]nums2[p2],将较大的元素放在 nums1[p] 位置。
    • 然后移动相应的指针,继续比较下一个元素。
  3. 处理剩余的元素

    • 如果 nums2 中还有元素未处理完,直接将它们放入 nums1 对应的位置。
    • 如果 nums1 的元素已经放完,但 nums2 还有剩余的元素,这种情况是可以通过后续的 while (p2 >= 0) 循环来处理。

示例解释:

  • 对于示例1:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
  1. 初始状态:p1 = 2, p2 = 2, p = 5
  2. 比较 nums1[2] = 3nums2[2] = 6,6 大,放入 nums1[5],指针移动:p2 = 1, p = 4
  3. 比较 nums1[2] = 3nums2[1] = 5,5 大,放入 nums1[4],指针移动:p2 = 0, p = 3
  4. 比较 nums1[2] = 3nums2[0] = 2,3 大,放入 nums1[3],指针移动:p1 = 1, p = 2
  5. 比较 nums1[1] = 2nums2[0] = 2,相等,放入 nums1[2],指针移动:p2 = -1, p = 1
  6. 此时 p2 < 0,合并完成,最终结果为 [1, 2, 2, 3, 5, 6]

时间复杂度分析:

  • 由于每个元素只遍历一次,时间复杂度为 O(m + n)。
  • 空间复杂度为 O(1),因为我们只是在原地修改 nums1

这个方法能够高效地解决问题,并且符合进阶要求的 O(m + n) 复杂度。

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

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

相关文章

next 从入门到精通

next 从入门到精通 相关链接 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 hello 大家好&#xff0c;我是 数擎科技&#xff0c;今天来跟大家聊聊 Next.js 如果你遇到任何问题&#xff0c;欢迎联系我 m-xiaozhicloud 什么是 Next.js Next.js 是一个基于 Reac…

LeetCode 面试经典150题 50.Pow(x,n)

题目&#xff1a;实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c; &#xff09;。 思路&#xff1a; 代码&#xff1a; class Solution {public double myPow(double x, int n) {double ans 1;long N n;if (N < 0) {N -N;x 1 / x;}…

【读书笔记-《网络是怎样连接的》- 1】Chapter1-从Web浏览器开始

网络之旅的第一章&#xff0c;我们从在浏览器中输入url开始。本章主要介绍三部分内容。首先是在Web浏览器中输入URL后&#xff0c;浏览器是如何解析URL并生成HTTP请求消息的。生成请求消息后&#xff0c;浏览器需要将请求发送给Web服务器&#xff0c;需要知道Web服务器的IP地址…

AI人员睡岗识别摄像机

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;智能监控系统也得到了广泛应用。其中&#xff0c;AI人员睡岗识别摄像机 作为一种新型的智能监控设备&#xff0c;正在逐渐受到企业和机构的关注和使用。这种摄像机利用人工智能技术&#xff0c;能够实时监测和识别工作…

在 AI 大模型时代,了解 Agentic RAG 的核心理念至关重要

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Agentic RAG&#xff0c;即基于智能体的检索增强生成技术&#xff0c;融合了 AI Agent 与 RAG 技术的优势。该技术通过集成 AI Agent&#xff0c;显著提升了 RAG 系统的智能水平与自主能力&#xff0c;…

树和二叉树知识点大全及相关题目练习【数据结构】

树和二叉树 要注意树和二叉树是两个完全不同的结构、概念&#xff0c;它们之间不存在包含之类的关系 树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个结点的有限集&#xff0c;它或为空树&#xff08;n 0&#xff09;&#xff1b;或为非空树&a…

Threejs创建正多边体

上一章节实现了球体的绘制&#xff0c;这节来绘制多面体&#xff0c;包括正多面体&#xff0c;平面中&#xff0c;每条边一样长组成的图形叫正多边形&#xff0c;这里每个面一样&#xff0c;叫正多面体。如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#…

【c++面试总结】

1. NULL 和 nullptr 区别 int overLoadTest(int x) {cout << __LINE__ << endl;return 0; }int overLoadTest(char* x) {cout << __LINE__ << endl;return 0; }int main() {char x[10] {1,2,3,4,5};overLoadTest(1);overLoadTest(x);overLoadTest(nu…

LeetCode 918. 环形子数组的最大和

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n…

Node.JS 版本管理工具 Fnm 安装及配置(Windows)

Fnm 安装及配置&#xff08;Windows&#xff09; Fnm&#xff08;Fast Node Manager&#xff09;&#x1f680; 一个快速而简单的 Node.js 版本管理工具&#xff0c;使用 Rust 编写。 1 安装 官网&#xff1a;Fnm&#xff08;镜像网站 &#xff09;。下载&#xff1a;Fnm&a…

【议题征集 】上海站 nMeetup 将于十月份开启!

上海&#xff0c;作为我国的经济和金融中心&#xff0c;正迅速发展成为全球领先的科技创新城市。这座城市不仅拥有深厚的文化底蕴&#xff0c;还积极拥抱数字化转型&#xff0c;推动着数据库和人工智能基础设施的快速发展。第三站 nMeetup 我们将走进上海&#xff0c;本次活动由…

被Karpathy誉为“蕴藏着类似ChatGPT的机会的AI产品Notebook LM”,它到底做对了什么?

就在昨天&#xff0c;Karpathy在X上连续发布了多条安利帖&#xff0c;强烈地给大家推荐一个AI产品NotebookLM。 嘶&#xff5e;给周围人疯狂种草并不稀奇&#xff0c;但Karpathy的推荐理由给NotebookLM戴了一个高帽子-他提到这款产品让人联想到ChatGPT。 这种就令人好奇&#…

数通 1

通信&#xff1a;需要介质才能通信电话离信号塔&#xff08;基站&#xff09;越远&#xff0c;信号越弱。信号在基站之间传递。你离路由器越远&#xff0c;信号越差。一个意思 比如想传一张图片&#xff0c;这张图片就是数据载荷 网关&#xff0c;分割两个网络。路由器可以是网…

vue + echarts 快速入门

vue echarts 快速入门 本案例即有nodejs和vue的基础&#xff0c;又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…

TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用

TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…

【15%】100小时机器学习——什么是机器学习

前言 虽然已经好久没有更新了&#xff0c;但笔者最近一直都在努力学习哦。 前面三三两两根据GitHub上的项目写了一些实验操作&#xff0c;但是总觉得这样是不行的。碎片化的学习只能是建立在已知的基础上进行熟练&#xff0c;不能作为打基础的主力方法&#xff0c;最关键的是&a…

用责任链模式改造 if else

我的上一篇文章&#xff0c;因为if else 多了&#xff0c;捣鼓很久&#xff0c;今天用责任链模式改造一下。 代码写着写着&#xff0c;if else if 逻辑忘记了&#xff0c;哎。。。-CSDN博客 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 1. 什么是责任…

Linux下的基本指令/命令(一)

目录 基本命令 1. Is命令/指令: 罗列当前目录下指定的文件或者目录. 2. pwd命令&#xff1a; 查看当前工作的路径 3. cd命令&#xff1a; 切换到指定路径下。 只能切换到目录中 4. tree命令: 树状显式目录 使用前要输入命令 yum install -y tree &#xff0c;用来安装一个…

Redis入门第二步:Redis数据类型详解

摘要&#xff1a; 欢迎继续跟随《Redis新手指南&#xff1a;从入门到精通》专栏的步伐&#xff01;在本文中&#xff0c;我们将深入探讨Redis支持的各种数据类型&#xff0c;这些类型是Redis强大功能的核心。通过学习不同的数据类型&#xff0c;你将能够根据具体的应用需求选择…

【Spring基础3】- Spring的入门程序

目录 3-1 Spring的下载3-2 Spring的 jar 包3-3 第一个 Spring程序第一步&#xff1a;添加spring context的依赖&#xff0c;pom.xml配置如下第二步&#xff1a;添加junit依赖第三步&#xff1a;定义bean&#xff1a;User第四步&#xff1a;编写spring的配置文件&#xff1a;bea…