6.移除元素

文章目录

  • 题目简介
  • 题目解答
    • 解法一:双指针
      • 代码:
      • 复杂度分析:
    • 解法二:双指针优化
      • 代码:
      • 复杂度分析:
  • 题目链接

大家好,我是晓星航。今天为大家带来的是 相关的讲解!😀

题目简介

image-20240507214021068

image-20240507214030508

题目解答

解法一:双指针

代码:

class Solution {public int removeElement(int[] nums, int val) {int n = nums.length;int left = 0;for (int right = 0;right < n;right++) {if (nums[right] != val) {nums[left] = nums[right];left++;}}return left;}
}

使用双指针:右指针 right指向当前将要处理的元素,左指针 left指向下一个将要赋值的位置。

那么此时情况就很简单了,之有两种right指向的元素等于val,right指向的元素不等于val。

  • 如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移(left++ right++);
  • 如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位(right++)。

最后题目要求返回移除后数组的新长度,就是left的长度,我们直接返回整型left即可。

复杂度分析:

image-20240507214448941

解法二:双指针优化

这里也是使用的双指针,但是这里效率比第一种解法要高,为什么呢,且听我细细道来。

思路:如果要移除的元素恰好在数组的开头,例如序列[1,2,3,4,5],当 val为 1时,我们需要把每一个元素都左移一位。注意到题目中说:「元素的顺序可以改变」。实际上我们可以直接将最后一个元素 5 移动到序列开头,取代元素 1,得到序列[5,2,3,4],同样满足题目要求。这个优化在序列中 val\textit{val}val 元素的数量较少时非常有效。

代码:

class Solution {public int removeElement(int[] nums, int val) {int left = 0;int right = nums.length;while(left < right) {if (nums[left] == val) {nums[left] = nums[right - 1];right--;} else {left++;}}return left;}
}

通过代码分析,我们直接将双指针指向数组的开头和结尾,然后我们使用while进行死循环,直到left>=right跳出,当我们左指针等于要删除的值val时,我们直接将左指针的值指向右指针的值然后右指针减减,继续循环。如果左指针的值不等于val那么左指针就直接加加往右走。直到我们左指针和右指针相遇就跳出循环,此时我们左指针的值就是我们数组的长度大小。

这个方法的好处是我们只需要遍历数组一次就可以解答完成。

复杂度分析:

image-20240507220803661

题目链接

27. 移除元素 - 力扣(LeetCode)

感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

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

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

相关文章

上海计算机学会2021年1月月赛C++丙组T2康托表

题目背景 康托是一名数学家&#xff0c;他证明了一个重要的定理&#xff0c;需要使用一张表&#xff1a; 这个表的规律是&#xff1a; 从上到下&#xff1a;每一行的分子依次增大&#xff1b;从左到右&#xff1a;每一列的分母依次增大。 康托以一种不重复、不遗漏的方式&am…

基于Springboot的教学辅助系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的教学辅助系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

QSPI的使用

Quad SPI接口(QSPI)是一种同步串行数据链路,在主模式下提供与外部设备的通信。它类似于SPI协议,只是它有额外的数据线。 普通SPI有四条通信线路:芯片选择、时钟、MOSI和MISO。对于QSPI,可提供额外的数据线。因此,命令/数据/地址是根据所选模式通过单、四或双IO发送的。由…

Linux内核--设备驱动(七)媒体驱动框架整理--HDMI框架(1)

目录 一、引言 二、HDMI框架 ------>2.1、硬件结构 ------>2.2、上层协议 ------------>2.2.1、HDCP协议 ------>2.3、HDMI驱动源码分析 ------------>2.3.1、HDMI dts节点 ------------>2.3.2、驱动 ------------>2.3.3、热插拔 三、HDMI时序 …

Git使用经验总结4-撤回上一次本地提交

这个问题的意义在于&#xff0c;Git提交代码是先提交到本地&#xff0c;然后再推送到远端。一些比较严格的Git仓库会有一些代码提交检查&#xff0c;一旦检查到问题就会禁止提交。那么这个时候就尴尬了&#xff0c;本地已经提交了&#xff0c;但是远端又推送不上去。基于当前版…

git 更换远程仓库地址三种方法总结

git 更换远程仓库地址三种方法总结 一、前言 由于私服的 gitlab 的地址变更&#xff0c;导致部分项目代码提交不上去&#xff0c;需要修改远端仓地址。 其它需要修改远程仓地址的情况如&#xff1a;切换git clone 协议由ssh变为https。 二、环境 windows 10git version 2.3…

跨域初识--.如何解决跨域

04 【跨域初识】 1.同源策略 同源策略(Same-Origin Policy)最早由Netscape 公司提出&#xff0c;是浏览器的一种安全策略同源&#xff1a; 协议、域名、端口号必须完全相同跨域&#xff1a; 违背同源策略就是跨域 2.如何解决跨域 2.1 JSONP jsonp只支持get请求不支持post请…

Linux实操之常用指令详解

文章目录 vi 和 vimvi 和 vim 基本使用 开机、重启和用户登录注销关机&重启命令用户登录和注销 用户管理基本介绍基本语法细节说明修改密码删除用户查询用户信息指令切换用户查看当前用户/登录用户用户组 实用指令指定运行级别帮助指令文件目录类时间和日期类搜索查找类压缩…

C语言从入门到入门

一、引言 C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归等功能,其设计提供了低级别的存取权限,并且要求程序员管理所有的内存细节。C语言具有高效、灵活和可移植性等特点,因此被广泛应用于系统编程、嵌入式系统开发、游戏开发等领域。 …

ENVI下实现遥感矿物蚀变信息提取

蚀变岩石是在热液作用影响下&#xff0c;使矿物成分、化学成分、结构、构造等发生变化的岩石。由于它们经常见于热液矿床的周围&#xff0c;因此被称为蚀变围岩&#xff0c;蚀变围岩是一种重要的找矿标志。利用围岩蚀变现象作为找矿标志已有数百年历史&#xff0c;发现的大型金…

uni-app H5上传图片压缩体积大小

// 用户上传头像 uploadAvatar(){ let _this this uni.chooseImage({ success: (chooseImageRes) > { const tempFilePaths chooseImageRes.tempFilePaths; …

Linux\_c输出

第一条Linux_c输出 初界面 : ls # 显示目录下的文件cd # 进入到某个目录 # 比如 我进入了Codels # 发现没有显示, 说明为文件下为空vim cpucdoe.c # 创建一个 .c的源码文件进入到了vim的编辑界面: i # 按i 就可以进行编辑 , 下面显示插入标识在编辑模式下, 可以通…

自定义类如何实现信号与槽机制

如果直接创建一个类&#xff0c;他是没有信号与槽机制的&#xff0c;我们需要人为的干预才可以 #ifndef TCPSERVER_H #define TCPSERVER_H#include <QTcpServer>class TcpServer : public QTcpServer {public:TcpServer(); };#endif // TCPSERVER_H在头文件里面加入Q_O…

云计算导论(1)---云计算概述

文章目录 1. 云计算定义与特点2. 云计算的技术架构3. 云计算面临的挑战 1. 云计算定义与特点 1. 云是网络、互联网的一种比喻说法。云计算是基于互联网的相关服务的增加、使用和交付模式&#xff0c;通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。 2. 云计算是一种…

Java性能优化(五)-多线程调优-Lock同步锁的优化

作者主页&#xff1a; &#x1f517;进朱者赤的博客 精选专栏&#xff1a;&#x1f517;经典算法 作者简介&#xff1a;阿里非典型程序员一枚 &#xff0c;记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; ❤️觉得文章还…

Android getevent命令详细分析

在调试Android 的输入事件时&#xff0c;经常使用 “getevent -lrt” 命令&#xff0c;来确认驱动上报数据是否正常。从源码的角度来详细的分析一下getevent 这个程序。 首先用ls命令来看一下getevent lrwxr-xr-x 1 root shell 7 2023-11-20 10:08 system/bin/getevent -> …

独有病眼花,春风吹不落。 (二维坐标压缩成一个点,并查集)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 8 1 1 D 1 1 R 1 2 D 2 1 D 2 2 R 3 1 R 3 2 R 2 3 D 输出 8 思路&#xff1a; 根据题意&#xff0c;要求连接线段后&#xff0c;操作多少次&#xff0c;连接的线段闭合&…

cmake install命令无法覆盖同名文件

文章目录 1. 问题记录2. 原因排查3. 解决方案 1. 问题记录 我有两个同名文件test.txt&#xff0c;它们内容不同&#xff0c;但时间戳相同&#xff08;文件属性中的修改时间相同&#xff09; 我希望在cmake中利用install命令&#xff0c;将${PATH_SRC}/test.txt替换${PATH_DES…

智能网联汽车网络和数据安全态势分析

文章目录 前言一、我国智能网联汽车安全态势分析(一)我国高度重视智能网联汽车安全发展(二)产业高速发展伴随网络安全隐患(三)网络和数据安全风险事件威胁加剧二、智能网联汽车网络和数据安全典型实践剖析(一)立标准规范,把牢安全发展“方向盘”(二)强车主服务,系好…

数据库系统理论——绪论

文章目录 前言一、数据库四个基本概念1、数据2、数据库3、数据库管理系统&#xff08;DBMS&#xff09;4、数据库系统&#xff08;DBS&#xff09; 二、数据模型1、概念数据模型2、逻辑数据模型3、物理数据模型 三、三级模式1、图片解析2、二级映像 前言 最近很长时间没更新学…