【LeetCode题目详解】(一)27.原地移除元素、88.合并两个有序数组

news2024/11/28 4:35:36

目录

一、力扣第27题:原地移除元素

1.思路一:

2.思路二

3.思路三

 二、力扣第88题:合并两个有序数组

1.思路一:

2.思路二:

3.思路三:

总结


一、力扣第27题:原地移除元素

题目链接:27. 移除元素 - 力扣(Leetcode)

题目描述:

1.思路一:

其实对于这道题而言,我们一开始最先想到的方法是这样的

假设我们有这样一个数组

我们先遍历一遍数组,寻找2,找到2以后,让后面的所有数据去全部依次覆盖,最后让数组当前的元素个数-1.

 然后继续遍历

 最后一次删除

就这样我们就删除了所有的元素,这种方法思考起来很简单,但其实是行不通的,因为时间复杂度太大了

我们计算时间复杂度是看最坏的情况,试想一下,我们最坏的情况就是全部的元素都需要删除,那么他的时间复杂度将达到N*(N-1+N-2+N-3+.....+1) ,因为我们本身就需要对整个数组进行一次遍历,第一个数据的删除一n-1次,第二个数据的删除要n-2次....最后一个数据的删除要1次。这个时间复杂度已经达到了立方级别,相当的大。

2.思路二

我们是这样想的,既然思路一的时间复杂度如此之大,那么我们可不可以这样思考,在开辟一个数组空间,将原来数组的值不等于2的数据依次拷贝到新的数组中。最后再把新数组的值拷贝到原来数组中。这样的话,我们就只需要一次遍历即可,这样时间复杂度就达到了O(N)

 但是这样违背了提议,因为我们的空间复杂度也变成了O(1),所以这个方法肯定是不可以的

3.思路三

我们其实可以在思路二上进行改良,使用两个指针来实现我们的目的

如下图所示,我们定义两个指针src和dest。让他们都指向第一个元素

然后我们让src往后走,如果src的位置不是val,就将他放到dest的位置,然后两个指针都++

如果src的位置是val,那就只让src++

下面是第一步移动,src指向的不是2,所以两个指针都往后移动

 这是第二步移动src指向的不是2,所以两个指针都往后移动

 这是第三次移动src指向的是2,所以src移动

这是第四次移动src仍然指向的是2,所以继续src往后移动

这是第五次移动,此时src指向的不是2,所以将3赋给dest所指向的值,两个指针都移动

 这是第六次移动,src指向的不是2,所以将src的值赋给dest,然后两个指针都向后移动

 这是第七次移动,src指向的不是2,所以src的值赋给dest,然后两个指针都向后移动

这是第八次移动,src指向的仍然不是2,所以src要继续向后移动

 此时src已经超出了数组的长度,所以现在遍历结束。dest之前,不包含dest本身的元素就是删除完2以后的数组,并且dest也代表的数组的长度,总共是5个元素

所以说这道题思路我们就想明白了,接下来就让我们来实现一下吧

int removeElement(int* nums, int numsSize, int val){
    int src=0;
    int dest=0;
    while(src<numsSize)
    {
        if(nums[src] != val)
        {
            nums[dest]=nums[src];
            dest++;
            src++;
        }
        else
        {
            src++;
        }
    }
    return dest;
}

 已通过力扣用例

 二、力扣第88题:合并两个有序数组

题目链接:88. 合并两个有序数组 - 力扣(Leetcode)

题目描述:

1.思路一:

对于这道题,我们应该能想到之前做过的一个题,也是合并两个有序数组,不过有所不同的是,那道题是将元素都放到第三个数组中,而这道题都是放在第一个数组中,这样一来,我们当然可以用之前那种思路,先弄一个第三个数组,然后放进去,然后将第三个数组的元素都弄到第一个数组中,但是这样显得太过于啰嗦了。而且空间复杂度也变大了。我们最好另寻他法

2.思路二:

和之前那道题目一样,我们可以不管什么东西,全部放在第一个数组中,然后对他进行排序。但是这样时间复杂度又变得很大了。

3.思路三:

我们这个思路是建立在第一个思路之上的,我们知道,正难则反。所以我们可以从反面来进行解答这道题,我们放在第三个数组中的思想是,找小的,然后放在第三个数组中,那我们这道题可以从最大的开始,找最大的数,放在第一个数组的最后一个位置。

我们画图来模拟一下我们的思路,如下图所示,我们创建三个变量,一个是end1用于记录数组1的下标的,一个是end2用于记录数组2的下标。然后就是end用于记录合并之后的数组下标

我们先让nums1[end1]和nums[end2]比较

如果nums1[end1]大,那么让nums1[end1]的值放入nums1[end]中,然后让end1--,end--

如果nums2[end2]大,那么让nums2[end2]的值放入nums1[end]中,然后让end2--,end--

如果最终end2<0了,那么直接停止即可

如果最终end1<0了,那么将nums2中剩余的元素放入nums1中

我们来模拟一下这个流程

第一次移动,6比3大,所以6移动到最后,end2和end--

 第二次移动,5比3大,所以5移动,end和end2--

 第三次移动,3比2大,所以3移动,end1和end--

 第四次移动,两者一样大,随意移动一个即可,我们选择移动下面的。这样end2和end--

然后end2<0,所以直接结束即可

经过上面的分析,我们已经可以写出代码了,那么我们就来写出代码吧

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int end1=m-1;
    int end2=n-1;
    int end=m+n-1;

    while(end1>=0 && end2>=0)
    {
        if(nums1[end1]>nums2[end2])
        {
            nums1[end]=nums1[end1];
            end--;
            end1--;
        }
        else
        {
            nums1[end]=nums2[end2];
            end2--;
            end--;
        }
    }
    while(end2>=0)
    {
        nums1[end]=nums2[end2];
        end--;
        end2--;       
    }
}

总结

本次主要讲解了两道力扣题目:27.原地移除元素、88.合并两个有序数组

希望对大家有所帮助,如果对你有帮助,不要忘记一键三连哦!!!

想要知道后续更多更精彩的内容, 一定要关注我哦!!!

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

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

相关文章

基于YOLOv3的车辆号牌定位

01 OCR原理分析 本文中采用的车辆号牌识别部分的是采用CNNLSTMCTC组合而成&#xff0c;整个网络部分可以分为三个部分&#xff0c;首先是主干网络CNN用于提取字符的特征信息&#xff0c;其次采用深层双向LSTM网络在卷积特征的基础上提取文字或字符的序列特征&#xff0c;最终引…

基于java+springboot+mybatis+vue+mysql的校园台球厅人员与设备管理系统

项目介绍 校园台球厅人员与设备管理系统采用java技术&#xff0c;基于springboot框架&#xff0c;前端使用vue技术&#xff0c;mysql数据库进行开发&#xff0c;实现了以下功能&#xff1a; 本系统主要包括管理员和用户两个角色组成&#xff0c;主要包括以下功能&#xff1a;…

m基于LMMSE+turbo算法的信道估计均衡器误码率仿真,对比LS,DEF以及LMMSE三种均衡算法误码率

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 本文推导了符号间干扰&#xff08;ISI&#xff09;信道的矢量形状因子图表示。结果图具有树形结构&#xff0c;避免了现有图方法中的短周期问题。基于联合高斯近似&#xff0c;我们在LLR&#xf…

CUDA入门和网络加速学习(二)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. 基础矩阵乘法 下图是矩阵乘法的示意图&#xff0…

MySQL表的增删查改(上)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;MySQL 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 前面给大家分享了关于数据库的一些基本的操作&#xff0c;今天分享的是数据库的核心内容&#xff0c;那就是我们常说的增删查改&#xff0c;也是我们数…

达梦数据库,备份目录冲突

问题描述 达梦数据库执行全库备份&#xff0c;BACKUP DATABASE FULL BACKUPSET ‘/data_share/data_back’; 提示备份目录冲突 解决办法 指定的目录必须为一个空目录。 下图&#xff0c;我指定的目录下有一个test文件夹&#xff0c;所以导致失败&#xff0c;把test文件删除m

[附源码]Python计算机毕业设计SSM基于WEB的网上零食销售系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python OpenCV中的图像阈值处理

1 前言 上一篇介绍了用C如何对一幅图像进行阈值处理&#xff0c;本篇接着用python来做同样的事情。 图像阈值处理是很多高级算法的底层逻辑之一&#xff0c;比如在做图形检测&#xff0c;轮廓识别时&#xff0c;常常会先对图像进行阈值处理&#xff0c;然后再进行具体的检测或…

FreeRTOS使用 — 合理使用内存 “ 任务中创建任务 ”

前言 在我们学习 RTOS 的过程中&#xff0c;很多朋友都不会遇到内存不够的问题&#xff0c;因为大部分的开发板使用的芯片对学习来说&#xff0c;内存 “足够大” 。所以基本上很多人学会了基本功能&#xff0c;到了实际工作中使用&#xff0c;往往会遇到内存不够的问题&#…

pikachu靶场-10 XXE漏洞

XXE漏洞 概述 XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严…

shell语法总结一(持续补充)

文章目录一、变量1、变量的命名规则2、查看变量3、删除命令4、变量的作用域4.1、局部变量4.2、全局变量4.3、环境变量5、自定义变量6、只读变量二、字符串1、单引号2、双引号&#xff08;用的多&#xff09;3、拼接字符串4、获取字符串的长度5、提取子字符串三、shell数组1、定…

必须掌握的数据库面试问题

一、为什么用自增列作为主键 1、如果我们定义了主键(PRIMARY KEY)&#xff0c;那么InnoDB会选择主键作为聚集索引。 如果没有显式定义主键&#xff0c;则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。 如果也没有这样的唯一索引&#xff0c;则InnoDB会选择内置…

1990-2021年全国各省产业高级化 数据

1990-2021年全国各省产业高级化数据 1、来源为&#xff1a;统计NJ、各省NJ 2、包括&#xff1a;全国31个省份 3、时间&#xff1a;1990-2021年 4、指标包括&#xff1a; 各地区经纬度、第三产业增加值、第二产业增加值、高级化水平 高级化水平第三产业增加值(亿元) / 第二…

HTTP协议【报文格式】

文章目录HTTP协议什么是HTTP协议HTTP协议格式抓包工具的使用HTTP请求URLURL的组成URL encodeHTTP请求的报文格式HTTP响应的报文格式HTTP方法GET方法POST方法POST方法与GET方法的区别请求报头HTTP响应状态码状态码的组成状态码的类别HTTP协议 什么是HTTP协议 HTTP协议即Hyper T…

m基于GA遗传优化的多因素加权竞价博弈频谱分配算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 假设有M个用户均为MIMO Full Duplex&#xff0c;N个频率&#xff0c;1<N<M&#xff0c;设计算法实现M个用户与N个频率的匹配。 由于在一个MIMO系统中&#xff0c;用户数量M大于可用的频谱个…

web自动化测试入门篇04——selenium+python基础方法封装

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

记录一次解决centos不定时触发oom的经历

前言 前一段时间&#xff0c;业务部门的系统不定时的反馈&#xff0c;系统打开不了&#xff0c;提示&#xff1a; 等技术开发同学反应过来去查看业务状态时&#xff0c;服务又恢复了&#xff0c;由于不是核心的业务&#xff0c;并且出问题差不多1分钟左右&#xff0c;没太在意…

【Vue 快速入门系列】todoList案例小总结

文章目录一、案例效果二、项目介绍三、版本更新迭代末、项目素材1.css样式2.html一、案例效果 如下图所示&#xff0c;制作一个这样的记事本&#xff0c;可以使用这个记事本进行数据的存储以及管理&#xff0c;样式是天禹老师写好的我们直接使用就好了&#xff0c;主要在这个小…

[UE][UE5]零基础学习-学习记录1-UE5安装与基本使用方法

[UE5]学习1-UE5安装与基本使用方法写在前面01.作者碎碎念2.UE5安装方法01.UE5需要的电脑配置02.UE5安装方法001.Epic下载002.下载安装UE503.基本使用方法001.创建项目打开现有的项目&#xff1a;002.文件目录结构003.用户界面介绍1).3D画面视窗2).菜单栏3).内容浏览器4).属性面…

关于CM3/CM4位带操作的总结

1.位带操作定义 STM32的存储器映射中的内存区域和外设区域有一段地址空间&#xff08;都是最低1MB&#xff09;是位带区域&#xff0c;跟这个区域相对应的有一段位带别名区域&#xff0c;位带别名区的大小是位带区的32倍&#xff0c;位带别名区的每一个地址都对应位带区域的一个…