首页/新闻资讯/正文详情

LeetCode 27题:双指针法原地移除数组元素

发布时间:2026/11/3 22:56:32 来源:云帆数科 栏目:资讯中心
LeetCode 27题:双指针法原地移除数组元素
1. 题目解析与需求理解LeetCode第27题移除元素是一个经典的数组操作问题题目要求我们原地移除数组中所有等于给定值的元素并返回新数组的长度。这里的原地意味着不能使用额外的数组空间必须通过修改输入数组来实现。1.1 题目具体要求给定一个数组nums和一个值val我们需要移除所有数值等于val的元素元素的顺序可以改变返回新数组的长度必须原地修改数组空间复杂度应为O(1)1.2 示例说明假设输入nums [3,2,2,3]val 3正确操作后数组前2个元素应为[2,2,...]返回长度22. 双指针解法详解双指针法是解决这类数组原地修改问题的高效方法时间复杂度O(n)空间复杂度O(1)。2.1 快慢指针实现def removeElement(nums, val): slow 0 for fast in range(len(nums)): if nums[fast] ! val: nums[slow] nums[fast] slow 1 return slow执行过程解析初始化慢指针slow0快指针fast遍历整个数组当nums[fast]≠val时将其复制到nums[slow]位置然后slow最后slow的值就是新数组长度2.2 双指针优化版本当要删除的元素很少时可以优化交换操作def removeElement(nums, val): left, right 0, len(nums) while left right: if nums[left] val: nums[left] nums[right-1] right - 1 else: left 1 return left这种实现减少了元素复制次数特别适合val出现频率低的情况。3. 边界条件与异常处理3.1 空数组情况当输入nums为空数组时应直接返回03.2 全部元素都需要删除如nums[1,1,1], val1应返回03.3 无元素需要删除如nums[1,2,3], val4应返回原数组长度33.4 单元素数组nums[1], val1 → 返回0 nums[1], val2 → 返回14. 不同语言的实现对比4.1 Java实现public int removeElement(int[] nums, int val) { int i 0; for (int j 0; j nums.length; j) { if (nums[j] ! val) { nums[i] nums[j]; i; } } return i; }4.2 JavaScript实现function removeElement(nums, val) { let slow 0; for (let fast 0; fast nums.length; fast) { if (nums[fast] ! val) { nums[slow] nums[fast]; } } return slow; }4.3 C实现int removeElement(vectorint nums, int val) { int slow 0; for (int fast 0; fast nums.size(); fast) { if (nums[fast] ! val) { nums[slow] nums[fast]; } } return slow; }5. 算法复杂度分析5.1 时间复杂度所有实现都是单次遍历数组时间复杂度为O(n)5.2 空间复杂度只使用了常数个额外变量空间复杂度O(1)5.3 操作次数对比基础双指针赋值操作次数等于非val元素数量优化版本赋值操作次数等于val元素数量更少6. 实际应用场景这种原地删除操作在以下场景很有价值内存受限环境下处理大型数据集流式数据处理中实时过滤嵌入式系统开发高性能计算场景7. 常见错误与调试技巧7.1 典型错误忘记移动慢指针边界条件处理不当使用额外数组空间返回数组长度而非新长度7.2 调试建议打印每次迭代后的数组状态跟踪快慢指针位置测试极端用例空数组、全删除等8. 扩展思考8.1 保持元素顺序如果需要保持非val元素的原始顺序双指针法是最佳选择8.2 删除多个不同值可以扩展为接收一个删除值集合逻辑类似8.3 链表版本类似思路可应用于链表节点删除9. 测试用例设计完整测试应包含test_cases [ ([3,2,2,3], 3, 2), # 标准情况 ([], 1, 0), # 空数组 ([1,1,1], 1, 0), # 全删除 ([1,2,3], 4, 3), # 无删除 ([1], 1, 0), # 单元素删除 ([1], 2, 1), # 单元素保留 ([4,1,2,3,5], 4, 4) # 删除首元素 ]10. 性能优化技巧对于几乎不含val的大数组优化版双指针更高效在C/C中可使用指针运算进一步优化多线程环境下可分块处理需注意数据竞争这个问题的核心在于理解原地操作的约束条件双指针法则提供了一种优雅的解决方案。掌握这种模式对解决类似数组操作问题大有裨益。

相关推荐

STM32入门必看:Proteus 8.6安装汉化与仿真全攻略
STM32入门必看:Proteus 8.6安装汉化与仿真全攻略

嵌入式入门这条路上,STM32几乎是绕不开的一站,而仿真工具Proteus则是很多人在没有实物板子时最先接触的验证手段。我见过太多新手卡在"软件装好了但界面全是英文""汉化包放进去没反应""仿真跑不起来提示缺少模型"这些环节… · 2026/11/3 22:56:32

Unix多路IO转接技术:从select到poll的演进与实践
Unix多路IO转接技术:从select到poll的演进与实践

1. Unix多路IO转接技术演进背景在网络编程领域,处理大量并发连接一直是核心挑战。传统的阻塞式IO模型为每个连接分配独立线程/进程的方式,在C10K问题(即单机1万并发连接)面前显得力不从心。这种背景下,Unix系统逐步发展… · 2026/11/3 22:55:32

NCP1342准谐振反激空载功耗与轻载管理设计
NCP1342准谐振反激空载功耗与轻载管理设计

简介:围绕NCP1342高频准谐振反激控制器整理的中文译文文档,面向离线电源变换器设计工程师、电源管理芯片学习者,以及需要快速查阅英文数据手册的研发人员。内容聚焦高集成准谐振反激控制器的核心机制与工程参数,涵盖高压启动与断电… · 2026/11/3 22:55:32

CC-Switch API Key全平台配置指南:从字段对齐到切换排查
CC-Switch API Key全平台配置指南:从字段对齐到切换排查

1. 先搞清楚 CC-Switch 到底在切什么很多人第一次接触 CC-Switch 这类工具,脑子里冒出来的第一个念头是"不就是个切换配置的小软件吗"。真上手之后才发现,它切的不只是几个字符串,而是一整套运行环境的上下文——API Key、接口地址… · 2026/11/4 8:12:46

AI芯片调研实战笔记:从算力指标到选型落地
AI芯片调研实战笔记:从算力指标到选型落地

给甲方做AI芯片调研,我整理了一份能直接用的实战笔记 入行这些年,接过不少AI芯片相关的调研需求。说实话,这玩意儿比大多数技术调研都难做:它横跨半导体工艺、计算机体系结构、软件生态、算法部署、市场竞争格局,任何一… · 2026/11/4 8:12:46

基于GA-BP神经网络的流场结构多目标优化实践
基于GA-BP神经网络的流场结构多目标优化实践

1. 项目背景与核心价值在流体力学工程实践中,我们经常面临这样的困境:如何在不牺牲性能的前提下,尽可能减小流场结构的尺寸?这个问题在航空航天、汽车设计、能源设备等领域尤为突出。传统方法往往依赖经验公式或试错实验&#xff… · 2026/11/4 8:12:46

AI工具选型方法论:从任务分类到场景实测的完整指南
AI工具选型方法论:从任务分类到场景实测的完整指南

1. 先聊聊为什么选个 AI 工具比想象中难得多最近因为工作原因,接触了大量用 AI 工具的朋友,有做内容运营的、有写代码的、还有搞设计做视频的。几乎每个人都会问同一个问题:AI 工具这么多,到底该怎么选?说实话&#xf… · 2026/11/4 8:12:46

UML建模实战:软件生命周期各阶段的精准建模方法
UML建模实战:软件生命周期各阶段的精准建模方法

1. 这不是画图比赛,而是软件开发的“施工蓝图”语言UML建模在软件生命周期中的应用——这标题乍看像教科书里的章节名,但在我带过的十几个中型项目里,它从来不是PPT里摆着好看的几张类图和时序图。它是需求方说“我要一个能自动比价的购物车”… · 2026/11/4 8:12:46

多人协作表格选型指南:权限、版本与迁移实战
多人协作表格选型指南:权限、版本与迁移实战

周三晚上十点半,项目群里同时冒出三个文件:一份叫“排期表-最终版”,一份叫“排期表-最终版(1)”,第三份最诚实,直接叫“排期表-真的最终版”。三个人各自改了两小时,谁也不知道对方动了哪几行。这种场面我… · 2026/11/4 8:11:46

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码