当前位置: 首页 > news >正文

LeetCode 27 移除元素

LeetCode 27 - 移除元素(Remove Element)是一个简单但经典的双指针问题,主要考察数组操作的基本功。虽然问题容易,但掌握多种解法以及衍生的变体问题对解决更复杂的操作数组问题有帮助。


题目描述

  • 输入:整数数组 nums 和目标值 val
  • 要求:原地移除数组中所有等于 val 的元素,并返回移除后数组的长度。
  • 注意
    1. 数组的元素可以被改变,但空间复杂度要求 O(1)。
    2. 函数返回不等于 val 的元素的长度,最终结果的前部分元素排列无所谓。

示例

输入:nums = [3, 2, 2, 3], val = 3
输出:2 (移除后的数组变为 [2, 2])输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5 (移除后的数组变为 [0, 1, 3, 0, 4])

常用解法及模板

解法 1:双指针法(快慢指针)

  • 核心思想:用两个指针 slowfastfast 遍历数组所有元素,slow 记录结果数组的索引。
    • 如果 nums[fast] != val,将 nums[fast] 写到 nums[slow] 位置,slow 自增。
    • 如果 nums[fast] == val,跳过不用写入。
  • 遍历结束后,nums[0..slow-1] 是保留的非 val 元素。

模板代码

class Solution {public int removeElement(int[] nums, int val) {int slow = 0;for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] != val) {nums[slow] = nums[fast]; // 写入非目标值slow++; // 慢指针前进}}return slow; // 最终的数组长度}
}

复杂度分析

  • 时间复杂度: O(n),遍历数组一次。
  • 空间复杂度: O(1),原地完成。

解法 2:双指针法(交换法)

  • 适用场景
    • 如果题目不要求保留数组的顺序,可以使用此解法。
    • 每次找到 val 时,将其与数组最后一个元素交换,从而用较少的操作移除目标值。
  • 核心思想:
    • 使用双指针 left(从头开始)和 right(从尾开始)。
    • 如果 nums[left] == val,将其与 nums[right] 交换,并递减 right
    • 如果 nums[left] != val,继续前进。
    • 遍历结束时,left 即为最终的结果长度。

模板代码

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

复杂度分析

  • 时间复杂度: O(n),每个元素最多遍历一次。
  • 空间复杂度: O(1),原地操作。

解法 3:计数后重写

  • 核心思想:先统计不等于目标值的所有索引,再将这些索引的值逐个复制回数组。
  • 步骤:
    1. 遍历数组,统计有多少个非 val 的元素。
    2. 通过线性遍历将非 val 的值重写到数组的前段。
  • 局限性:操作次数比双指针多,空间申请多一小部分,仍可 AC。

模板代码

class Solution {public int removeElement(int[] nums, int val) {int index = 0;// 第一遍数非目标值for (int i = 0; i < nums.length; i++) {if (nums[i] != val) {nums[index++] = nums[i];}}return index; // 非目标值个数即数组长度}
}

复杂度分析

  • 时间复杂度: O(n),两次线性遍历(统计 + 重写)。
  • 空间复杂度: O(1),依旧是原地操作。

解法 4:链表解法(当输入为链表时)

如果输入是链表而不是数组,移除目标值时可以使用“指针删除”,无需双指针。

  • 核心思路:
    • 遍历链表,跳过所有等于 val 的节点,通过调整前驱节点的 next 跳过符合条件的节点。
    • 引入一个哑节点简化边界情况的处理。

模板代码

class Solution {public ListNode removeElements(ListNode head, int val) {ListNode dummy = new ListNode(0, head);ListNode prev = dummy, cur = head;while (cur != null) {if (cur.val == val) {prev.next = cur.next; // 删除当前节点} else {prev = cur; // 前驱节点前移}cur = cur.next; // 当前节点前移}return dummy.next;}
}

复杂度分析

  • 时间复杂度: O(n),遍历链表一次。
  • 空间复杂度: O(1),只调整指针顺序。

经典变体问题

变体 1:移除所有值小于 val 的元素

在数组中移除所有小于指定值 val 的元素,保留其他元素。

思路:

  • 双指针法(快慢指针,根据条件修改数组)。

模板代码

class Solution {public int removeLessThan(int[] nums, int val) {int slow = 0;for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] >= val) {nums[slow++] = nums[fast]; // 保留大于等于 `val` 的元素}}return slow;}
}

变体 2:移除重复元素

移除数组中重复的元素,例如将 [1,1,2,2,3] 变为 [1,2,3]

思路:

  • 快慢指针法,slow 指针记录结果数组,fast 用于遍历。
  • 在重复元素时跳过。
class Solution {public int removeDuplicates(int[] nums) {if (nums.length == 0) return 0;int slow = 0;for (int fast = 1; fast < nums.length; fast++) {if (nums[fast] != nums[slow]) {slow++;nums[slow] = nums[fast];}}return slow + 1; // 新长度}
}

变体 3:移除 K 个范围内的元素

移除数组中值在 [low, high] 范围内的元素。

思路:

  • 改造 removeElement,在条件中加入区间判断即可。

模板代码

class Solution {public int removeElementInRange(int[] nums, int low, int high) {int slow = 0;for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] < low || nums[fast] > high) {nums[slow++] = nums[fast];}}return slow;}
}

快速 AC 总结

  1. 首先掌握核心解法(双指针法,快慢指针)。
  2. 熟练理解变体:换条件(小于值、重复元素、区间范围)时仍然可以用解法模板。
  3. 对应场景(数组 vs 链表)选择合适实现。例如链表用修改指针操作更方便。
  4. 高效背模板:模板结构固定,快速套用并扩展到变体问题。

相关文章:

LeetCode 27 移除元素

LeetCode 27 - 移除元素&#xff08;Remove Element&#xff09;是一个简单但经典的双指针问题&#xff0c;主要考察数组操作的基本功。虽然问题容易&#xff0c;但掌握多种解法以及衍生的变体问题对解决更复杂的操作数组问题有帮助。 题目描述 输入&#xff1a;整数数组 nums…...

对“预训练”的理解

预训练有什么用 传统的机器学习是偏数学的&#xff0c;对数据的量不做过多要求&#xff0c;而深度学习的项目通常是有大量的数据可供使用。 在平常的任务或者项目中&#xff0c;我们可能并没有大量数据&#xff0c;只有少量数据&#xff0c;在这时我们就可以通过“借用”有大…...

论文阅读:CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION?

CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION? 生成式大语言模型能否进行自动语音识别&#xff08;ASR&#xff09;纠错&#xff1f; https://arxiv.org/pdf/2307.04172 文章目录 速览常规总结通俗版 摘要&#xff08;Abstract&#xff09;2. 引言&a…...

Stable Diffusion(SD)系列模型及关联算法深度解析

一、‌基础模型架构演进‌ SD v1.5‌ ‌核心架构‌&#xff1a;基于Latent Diffusion Model&#xff08;LDM&#xff09;&#xff0c;通过VAE将图像压缩至潜空间进行扩散训练&#xff0c;支持512x512分辨率生成&#xff0c;兼容二次元与写实风格混合创作‌12。 ‌训练数据‌&…...

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…...

logback日志输出配置范例

logback日志输出配置范例 在wutool中&#xff0c;提供了logback日志输出配置范例&#xff0c;实现日志文件大小限制、滚动覆盖策略、定时清理等功能。 关于wutool wutool是一个java代码片段收集库&#xff0c;针对特定场景提供轻量解决方案&#xff0c;只要按需选择代码片段…...

【开源免费】基于SpringBoot+Vue.JS酒店管理系统(JAVA毕业设计)

本文项目编号 T 224 &#xff0c;文末自助获取源码 \color{red}{T224&#xff0c;文末自助获取源码} T224&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Unity中动态切换光照贴图LightProbe的方法

关键代码&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图&#xff1a;lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...

linux(2)用户管理

文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名&#xff0c;不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...

在鸿蒙HarmonyOS手机上安装hap应用

一、下载工具 安装hap包需要用到小工具 。 二、解压到目录后&#xff0c;进入该文件夹&#xff0c;打开命令行&#xff0c;如下图 三、将下载好的hap包放入刚才解压的文件夹内&#xff08;假设hap包文件名为app.hap&#xff09; 四、连接好手机和电脑&#xff0c;手机需要打…...

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...

工程化与框架系列(8)--持续集成实践

持续集成实践 &#x1f504; 持续集成&#xff08;Continuous Integration&#xff0c;简称CI&#xff09;是现代前端开发流程中的重要环节&#xff0c;它通过自动化构建、测试和部署&#xff0c;帮助团队更快速、更可靠地交付高质量代码。本文将详细介绍前端持续集成的实践方…...

Python核心技术,Django学习基础入门教程(附环境安装包)

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...

【Qt-信号与槽】connect函数的用法

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方…...

计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...

16. LangChain实战项目2——易速鲜花内部问答系统

需求简介 易束鲜花企业内部知识库如下&#xff1a; 本实战项目设计一个内部问答系统&#xff0c;基于这些内部知识&#xff0c;回答内部员工的提问。 在前面课程的基础上&#xff0c;需要安装的依赖包如下&#xff1a; pip install docx2txt pip install qdrant-client pip i…...

一文了解Conda使用

一、Conda库频道 conda的软件频道是存储软件包的远程位置&#xff0c;当在Conda中安装软件包时&#xff0c;它会从指定的频道中下载和提取软件包。频道包含了各种软件包&#xff0c;不同的频道可能提供不同版本的软件包&#xff0c;用户可以根据需要选择适合的版本。 常见 Co…...

AI辅助学习vue第十四章

第十四章&#xff1a;技术引领与未来展望 在第十五章&#xff0c;你已经在Vue技术领域深耕许久&#xff0c;积累了丰富的经验与卓越的影响力。此时&#xff0c;你将站在行业前沿&#xff0c;引领技术走向&#xff0c;为Vue技术的未来发展开辟新道路。 1. 引领Vue技术发展方向…...

chromadb向量数据库使用 (1)

目录 完整代码代码解释 完整代码 import chromadb chroma_client chromadb.Client()collection chroma_client.create_collection(name"my_collection")collection.add(documents["This is a document about pineapple","This is a document about…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...