力扣27.移除元素(双指针算法)

news2024/11/26 0:42:42

题目描述:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
在这里插入图片描述

在这里插入图片描述

解题思路:

首先我们应该明确题目的意思:**元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。**即我们可以将要输出的数组直接在原来数组的基础上进行修改即我们最总要将数组中不等于val的数值移动到一侧再统计其长度,将等于val的值移动到数组另一侧那么我们可以使用双指针算法,具体操作如下:

1.定义左右指针分别指向数组的两头,如果左指针小于右指针同时此时左指针指向的元素不等于val则将左指针向左移动一位;如果左指针小于右指针同时右指针指向的元素等于val,则将右指针向右移动一位。
2.交换此时左右指针指向的值
3.若最后左指针指向的值等于val则直接返回左指针,否则返回左指针加一!!!

对于第三点可能会有些疑问,我们看一个“栗子”!

假设**在已经进行如上的操作后的数组为:
[2, 2, 3, 3]

a:若以上数组最后操作后的左指针指向的为2(即此时nums[left] != val 为1)但是我们此时要饭返回的是数组的长度,则此时我们要返回left + 1
b:若以上数组最后操作后的左指针指向的为3(即此时nums[left] == val 为2)则我们直接返回left

代码:

class Solution {
    public int removeElement(int[] nums, int val) {
        //Tow pointers
        //N is the size of nums
        //Time Complexity: O(N)
        //Space Complexity: O(1)
        if (nums == null || nums.length == 0) {
            return 0;
        }
        //左右指针
        int left = 0;
        int right = nums.length - 1;
        while (left < right)  {
            if (left < right && nums[left] != val) {
                left++;
            }
            if (left < right && nums[right] == val) {
                right--;
            }
            //交换
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
        }

        //如果最后左指针指向等于val则直接返回,否则返回left + 1
        return nums[left] == val ? left : left+1;
    }
}

补充:

可能有的“童鞋”和我一开始都也会遗漏到一点:

	while (left < right)  {
            if (left < right && nums[left] != val) {
                left++;
            }
            if (left < right && nums[right] == val) {
                right--;
            }

也就是我想说有人能会问循环判断已经有了条件left < right*了为什么在移动指针时还要进行判断?*我们看一个错误例子就会明白其作用!!!
在这里插入图片描述
若出现这种情况我们不加以以上条件(在移动指针时)最后对于调用者返回的内容就不符合题意所需!

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

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

相关文章

编译openssl支持libcurl的https访问

如果编译时不带openssl库那么无法访问https的网页&#xff0c;从网页端什么也获取不到。 在调用post请求访问翔云OCR人脸识别时无法访问&#xff0c;而使用ssl&#xff0c;需要先在系统中安装OpenSSL。 如下图安装说明&#xff1a; 所以将原先安装的libcurl库删掉&#xff0…

MySQL事务的隔离级别

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;MySQL事务的隔离级别 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪…

【C与数据结构】——寒假提高每日练习Day2

一共16日的练习&#xff0c;分为选择题与编程题&#xff0c;涵盖了C语言所学以及数据结构的重点&#xff0c;以及一些秋招、春招面试的高频考点&#xff0c;难度会随着天数而上升。1-8day为C语言&#xff0c;9-16day为数据结构。 &#xff08;建议在电脑客户端进行&#xff0c…

docker中的数据卷

目录 1. 为什么使用数据卷 2. 数据卷基本操作 2.1 创建数据卷 2.2 查看数据卷 2.3 查看数据卷详细信息 2.4 数据卷删除 3. 数据卷的使用 3.1 先创建数据卷再挂载 3.2 直接挂载宿主机目录 3.3 只读数据卷 4. 数据卷容器 4.1 新建数据卷容器 4.2 新建一个容器来使用数…

Nacos学习笔记 (8)服务发现基础应用

1. 什么是服务发现 在微服务架构中&#xff0c;整个系统会按职责能力划分为多个服务&#xff0c;通过服务之间协作来实现业务目标。这样在我们的代码中免不了要进行服务间的远程调用&#xff0c;服务的消费方要调用服务的生产方&#xff0c;为了完成一次请求&#xff0c;消费方…

求空间曲线的切线,法平面

求空间曲线的切线&#xff0c;法平面&#xff1a;归结为求空间曲线的切向量 进而用点向式直线方程表示出切线&#xff0c;点法式方程表示出法平面 情况一&#xff1a;空间曲线以参数式给出&#xff0c;求切向量时直接求导即可&#xff0c;如下题 情况二&#xff1a;空间曲线…

ROS2 基础概念 话题

ROS2 基础概念 话题1. Topics2. rqt_graph3. 话题4. 话题类型5. 话题发布6. 话题频率1. Topics 话题是节点交换消息的总线 节点可以向任意数量的话题发布数据&#xff0c;并同时订阅任意数量的话题 2. rqt_graph 将使用rqt_graph来可视化不断变化的节点和话题&#xff0c;以…

云服务器ECS入门及云上网站部署

云服务器ECS入门及云上网站部署 一、什么是云服务器ECS 云服务器ECS (Elastic Compute Service) 是阿里云提供的性能卓越、稳定可靠、弹性扩展的laaS(Infrastructure as a Service) 级别云计算服务 云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天…

JavaScript操作BOM对象

BOM&#xff1a;浏览器对象模型 window代表浏览器窗口 >window.alert(1) undefined >window.innerHeight //浏览器内部高度 242 >window.innerWidth 1229 >window.outerHeight //浏览器外部高度 824 >window.outerWidth 1536 Navigator&#xff0c;封装了浏…

【Linux】第六部分 远程登录

【Linux】第六部分 远程登录 文章目录【Linux】第六部分 远程登录6. 远程登录6.1 配置hosts映射文件6.2 xshell和xftp的使用总结6. 远程登录 6.1 配置hosts映射文件 为什么要配置呢?利于后续我们进行连接方便,就比如:我们没有办法记住很多手机号,但是我们可以记住人名,我们打…

【20221225】【剑指1】链表

1、从尾到头打印链表 可以用rbegin&#xff0c;rend&#xff1b;也可以用reverse翻转数组。 2、如果是翻转链表的话&#xff08;双指针法&#xff0c;用虚拟头节点依次翻转&#xff09;&#xff1a;https://blog.csdn.net/HYAIWYH/article/details/127118468?ops_request_mi…

java ssm 摄影约拍系统的设计

目录 第一章 绪论 5 1.1 研究背景 5 1.2系统研究现状 5 1.3 系统实现的功能 6 1.4系统实现的特点 6 1.5 本文的组织结构 6 第二章开发技术与环境配置 7 2.1 Java语言简介 7 2.2JSP技术 8 2.3 MySQL环境配置 8 2.4 MyEclipse环境配置 9 2.5 mysql数据库介绍 9 2.6 B/S架构 9 第三…

6、集合介绍

文章目录6、集合6.1 介绍6.2 常用接口和类6.3 ArrayList6.3.1 介绍6.3.2 基本操作6.3.3 常用方法6.4 LinkedList6.4.1 基本操作6.4.2 常用方法6.5 泛型6.5.1 介绍6.5.2 基本使用6.6 比较器6.7 ArrayList和LinkedList的比较6.8 HashSet6.8.1 介绍6.8.2 常用方法6.8.3 重复数据6.…

Attetion is all you need论文阅读笔记

Attetion is all you need 参考&#xff1a;沐神&#xff08; 沐神_论文精讲_Attention is all you need&#xff09; 1、Abstract 主流的序列转录模型&#xff08;给一个序列生成另一个序列&#xff0c;比如机器翻译&#xff0c;给一句英文&#xff0c;生成一句中文&#x…

数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)

文章目录项目说明一、项目说明单位信息数据库字段&#xff1a;资源数据库字段项目需求二、项目开发1.项目分析2.引入库3.项目开发&#xff08;1&#xff09;地图容器构建&#xff08;2&#xff09;筛选和返回按钮事件&#xff08;3&#xff09;企业筛选功能&#xff08;4&#…

【java】stream流

文章目录体验stream流stream流的生成方式Stream流的常见中间操作方法Stream流的常见中间操作方法Stream流的常见终结操作方法Stream流的练习Stream流的收集操作体验stream流 package heima.stream流;import java.util.ArrayList;public class P1 {public static void main(Stri…

node.js+uni计算机毕设项目基于微信小程序的肉鸡养殖管理平台LW(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等…

第二十四章 数论——质数(2)(详细讲解质数的筛选原理和证明!!)

第二十四章 数论——质数的筛选一、朴素筛法——埃氏筛法1、问题描述2、算法思路3、代码实现二、线性筛法——欧拉筛1、朴素筛法的弊端2、欧拉筛&#xff08;1&#xff09;算法思路&#xff08;2&#xff09;代码实现一、朴素筛法——埃氏筛法 1、问题描述 2、算法思路 我们从…

【折腾服务器 2】妖板 Intel N5105 + i226 主板安装 群晖、直通 SATA 控制器 教程

Catch UP 前期回顾&#xff0c;我在这台使用 N5105 和 Intel 226V 2.5G 网卡的电脑上安装了 ESXi 7.0 系统。文章在博客里有&#xff0c;可以去翻翻。 Chapter 1 网络环境准备 登录 VMWare ESXi&#xff0c;点击左侧的网络。 点击 虚拟交换机 有一个 vSwitch 0 这个是默认的&a…

抽象类与接口(Java系列6)

目录 前言&#xff1a; 1.抽象类 1.1抽象类的概念及语法 1.2 抽象类的特征 1.3抽象类的特性 2.接口 2.1接口的概念及语法 2.2接口的使用及特性 2.2.1接口的使用 2.2.2接口的特性 2.3实现多个接口 2.4接口的继承 3.抽象类与接口的区别 结束语&#xff1a; 前言&…