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

LeetCode 27 · 移除元素——双指针一次遍历搞定,O(n²) 暴力解瞬间不香了

题目速览

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

不能使用额外空间,必须用 O(1) 的额外内存原地修改输入数组。


先搞清楚一件事:数组能"删除"吗?

不能。数组在内存中是连续存储的,你没办法在物理层面真正删除某个元素——所谓"删除",本质上是用后面的元素覆盖前面的元素

这也是Array.splice()/ C++erase()这类库函数"慢"的根本原因:删一个元素,后面所有元素都要向前移动一位,时间复杂度 O(n);如果在循环里反复调用,就变成了 O(n²)。


关于库函数的使用原则

刷算法题时有一条实用准则:

情况建议
库函数直接就能解决该题的核心逻辑❌ 不推荐用(失去练习意义)
库函数只是解题的某个小步骤✅ 推荐用(专注核心逻辑)

本题核心就是"移除元素",直接用splice/filter一行搞定但什么都没学到——所以我们手写。


方法一:暴力解 O(n²)

思路:两层 for 循环,外层遍历找到等于val的元素,内层让后面所有元素向前移一位。

functionremoveElement(nums,val){letsize=nums.length;for(leti=0;i<size;i++){if(nums[i]===val){// 找到目标值,后面所有元素前移for(letj=i+1;j<size;j++){nums[j-1]=nums[j];}i--;// 前移后当前位置需要重新检查size--;// 有效长度减一}}returnsize;}

缺点:两层循环,时间复杂度 O(n²),数据量大时性能差。


方法二:双指针(快慢指针)O(n) ✅ 推荐

核心思想:用两个指针在同一个数组上协作,一次遍历完成任务。

指针职责
fast(快指针)遍历原数组,寻找不等于val的元素
slow(慢指针)维护新数组的写入位置,slow的值就是新数组的长度

执行过程

  • fast每次向前走一步
  • nums[fast] !== val时,把这个"有效元素"写入nums[slow],然后slow++
  • nums[fast] === val时,fast继续走,slow不动(相当于跳过了这个值)
functionremoveElement(nums,val){letslow=0;for(letfast=0;fast<nums.length;fast++){if(nums[fast]!==val){// !== 是严格不等,同时比较值和类型nums[slow]=nums[fast];slow++;}}returnslow;// slow 就是新数组的长度}

nums = [3,2,2,3]val = 3为例走一遍:

初始:slow=0, fast=0 fast=0: nums[0]=3 === val,跳过 fast=1: nums[1]=2 !== val,nums[0]=2,slow=1 fast=2: nums[2]=2 !== val,nums[1]=2,slow=2 fast=3: nums[3]=3 === val,跳过 结果:nums=[2,2,2,3],返回 slow=2(前两位有效)

复杂度对比

方法时间复杂度空间复杂度
暴力两层循环O(n²)O(1)
快慢双指针O(n)O(1)

总结

双指针(快慢指针)是处理数组原地操作的经典范式,本题是它最基础的应用场景。记住这个模板:

fast 负责探路,slow 负责落笔。fast 扫到"有效值"就交给 slow 写入,slow 的最终位置就是答案。

http://www.jsqmd.com/news/862017/

相关文章:

  • 11.三层网络VXLAN
  • 【SSD】闪存1
  • VGG16猫狗二分类数据集处理
  • ops-transformer 基础设施性能实验报告:GE 融合边界与 Runtime 调度效率实测
  • 机器学习之逻辑回归算法
  • 远程技术面试的潜规则:摄像头角度可能影响你的录用
  • RUST编程学习.2语法
  • N-Tron交换机的网络可用性到底有多强?
  • 终极指南:5分钟掌握iFakeLocation实现iOS虚拟定位的完整方法
  • 鸿蒙中的自由流转
  • Midjourney色彩一致性难题破解(CMYK→sRGB跨域校准实战手册)
  • 英伟达的“围城”:云厂商自研芯片,攻到了哪一步?
  • 2026 年 5 月云手机横评:傲晨云领跑,红手指 / 川川云对比实测
  • SMARTFORM不同模板一起打印
  • 计算机毕业设计 | SpringBoot+vue医院药品管理系统(附源码+论文)
  • 彻底掌控Windows Defender:开源工具defender-control完全指南
  • 中画幅风格仅限Pro订阅者可用?不!3个未公开API参数+本地化--seed锁定技巧,让免费账户稳定输出中画幅质感
  • 在家办公效率低?试试这个“空间切换”技巧
  • Word文档保护技巧:防止内容被轻易复制
  • 2026年4月钢边止水带企业推荐分析,聚乙烯闭孔泡沫板/聚乙烯泡沫棒/钢边止水带/橡胶止水带,钢边止水带生产厂家找哪家 - 品牌推荐师
  • STM32矩阵按键详解——4×4行列扫描与非阻塞消抖(硬件总结六)
  • 把SAC model的数据导出到BW的ADSO中
  • 几十万买的数字孪生低代码平台集体落灰?被隐瞒的落地真相,终于说透了
  • 【Unity】MiniGame编辑器小游戏(十六)中国象棋局域网对战【Chinese Chess】(下)
  • 变压器设计-基于AP法
  • 408 每日一题 Day 2:二叉树的重构与遍历
  • 强制启动 Cursor IDE 主程序(不带 Agent 模式)
  • leetcode思路-236 二叉树的最近公共祖先
  • 最常见的漏洞有哪些?如何发现存在的漏洞呢
  • 分布式团队的代码协作规范:从分支策略到提交信息格式