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

删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素

  📝 题目:移除元素

  题目描述: 给定数组和值val,原地移除所有等于val的元素,返回新长度。

  例子: nums = [3,2,2,3], val = 3 → nums = [2,2,_,_], return 2

  🔥 暴力法思路:

  暴力法想法:

  "我要删除所有等于val的元素,
那我就从头开始找,
遇到一个val就删除它,
然后所有后面的元素都向前移动一位。"

  暴力法代码:

  def removeElement_brute(nums, val):i = 0while i < len(nums):if nums[i] == val:# 删除当前元素:所有后面元素前移for j in range(i, len(nums) - 1):nums[j] = nums[j + 1]nums.pop()  # 删除最后一个元素# 注意:i不自增,因为删除后要检查新的nums[i]else:i += 1return len(nums)

  暴力法执行过程:

  初始: [3, 2, 2, 3], val = 3

  i=0: nums[0]=3==val,删除
删除后: [2, 2, 3, _],长度变成3

  i=0: nums[0]=2!=val,i++

  i=1: nums[1]=2!=val,i++

  i=2: nums[2]=3==val,删除
删除后: [2, 2, _, _],长度变成2

  结束: 返回2

  暴力法问题: 每次删除都要移动大量元素,效率低!

● 🎯 双指针法思路(快慢指针):

  双指针法想法:

  "我不删除元素,而是重新整理数组!
用两个指针:
- slow指针:指向下一个要放入好元素的位置
- fast指针:遍历所有元素
如果fast指向的元素不是val,就放到slow位置"

  核心理念: "覆盖代替删除"

  不要真的删除,而是用好的元素覆盖坏的位置!

  双指针法代码:

  def removeElement_two_pointers(nums, val):slow = 0  # 慢指针:下一个好元素要放的位置for fast in range(len(nums)):  # 快指针:遍历所有元素if nums[fast] != val:      # 如果是好元素nums[slow] = nums[fast]  # 放到slow位置slow += 1                # slow后移return slow  # slow就是新数组的长度

  双指针法执行过程:

  初始: [3, 2, 2, 3], val = 3
slow=0, fast=0

  fast=0: nums[0]=3==val,跳过
slow=0 不变

  fast=1: nums[1]=2!=val,是好元素
nums[0] = nums[1] = 2
数组变成: [2, 2, 2, 3]
slow = 1

  fast=2: nums[2]=2!=val,是好元素
nums[1] = nums[2] = 2
数组变成: [2, 2, 2, 3]
slow = 2

  fast=3: nums[3]=3==val,跳过
slow=2 不变

  结果: 数组前2位是[2,2],返回长度2

  🔍 双指针法的巧妙之处:

  1. 两个指针的分工:

  slow指针:维护"已整理好的部分"
fast指针:探索"还没处理的部分"

  2. 状态变化:

  初始: [需要处理的部分          ]
slow=0

  进行中: [已整理好] [需要处理的部分]
↑slow      ↑fast

  最终: [已整理好] [垃圾区域]
↑slow

● 🧠 两种方法的思维对比:

  | 维度    | 暴力法思维   | 双指针法思维  |
|-------|---------|---------|
| 操作方式  | 真实删除元素  | 覆盖重排元素  |
| 思考角度  | "删掉坏的"  | "保留好的"  |
| 处理策略  | 遇到坏元素就删 | 遇到好元素就搬 |
| 时间复杂度 | O(n²)   | O(n)    |
| 空间复杂度 | O(1)    | O(1)    |

  💭 思维转换的关键:

  暴力法思维:

  "我要删除所有val=3的元素"
↓ 直接但低效
真的去删除和移动

  双指针法思维:

  "我要构建一个新数组,只包含不等于val的元素"
↓ 间接但高效
原地重新排列

  🎯 双指针法的核心洞察:

  关键洞察1: 不需要真的删除,只需要重新排列
关键洞察2: 好元素的相对顺序不变
关键洞察3: 只关心前面的好元素,后面的垃圾不管

  为什么双指针法更快?

  暴力法:每次删除都要移动O(n)个元素 → 总共O(n²)
双指针法:每个元素只被访问一次,只做O(1)操作 → 总共O(n)

  ★ Insight ─────────────────────────────────────
双指针法的精髓是"重新定义问题":从"删除不要的元素"重新定义为"收集想要的元素"。这种思维转换让我们从删除操作(需要移动大量元素)变成了覆盖操作(只需要一次赋
值),从而大幅提升效率。
─────────────────────────────────────────────────

● 总结:暴力法="删掉坏的",双指针法="收集好的"。关键思维转换:从删除操作变成覆盖操作,效率从O(n²)提升到O(n)!


文章转载自:

http://0TzncxpV.fwcjy.cn
http://qFSaasbp.fwcjy.cn
http://YFYpSnXH.fwcjy.cn
http://xVm2UeAH.fwcjy.cn
http://xTtZRNuD.fwcjy.cn
http://djy0exO4.fwcjy.cn
http://kktr2Mvj.fwcjy.cn
http://fx4jPR4A.fwcjy.cn
http://MNGIL7sQ.fwcjy.cn
http://10maGYTS.fwcjy.cn
http://ve7dNRwi.fwcjy.cn
http://ljJi9Yjx.fwcjy.cn
http://DOJGGuhj.fwcjy.cn
http://TkbSklBW.fwcjy.cn
http://Qs7y0S41.fwcjy.cn
http://ixIvNFcc.fwcjy.cn
http://25M4VbyB.fwcjy.cn
http://871BKbLL.fwcjy.cn
http://ytCH4QQG.fwcjy.cn
http://dY8OQtjb.fwcjy.cn
http://4VMYEL3r.fwcjy.cn
http://Ldkr8bnF.fwcjy.cn
http://MVtdP5CR.fwcjy.cn
http://p0oYJNud.fwcjy.cn
http://gy1Ay3iP.fwcjy.cn
http://gNNvv0E8.fwcjy.cn
http://KR92pEWw.fwcjy.cn
http://sm7jvUdq.fwcjy.cn
http://zrhlIf7b.fwcjy.cn
http://rJZDm4t0.fwcjy.cn
http://www.dtcms.com/a/368393.html

相关文章:

  • 代码随想录算法训练营第三天| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表
  • 结合机器学习的Backtrader跨市场交易策略研究
  • 前端开发vscode插件 - live server
  • 码农的“必修课”:深度解析Rust的所有权系统(与C++内存模型对比)
  • 【Python基础】 17 Rust 与 Python 运算符对比学习笔记
  • 云手机可以息屏挂手游吗?
  • 会话管理巅峰对决:Spring Web中Cookie-Session、JWT、Spring Session + Redis深度秘籍
  • 腾讯云大模型训练平台
  • iPhone17全系优缺点分析,加持远程控制让你的手机更好用!
  • 数据泄露危机逼近:五款电脑加密软件为企业筑起安全防线
  • 阿里云vs腾讯云按量付费服务器
  • DocuAI深度测评:自动文档生成工具如何高效产出规范API文档与数据库表结构文档?
  • React JSX 语法讲解
  • 工厂办公环境如何实现一台服务器多人共享办公
  • 从 0 到 1 学 sed 与 awk:Linux 文本处理的两把 “瑞士军刀”
  • VNC连接服务器实现远程桌面-针对官方给的链接已经失效问题
  • 【Web】理解CSS媒体查询
  • 编写前端发布脚本
  • 无密码登录与设备信任:ABP + WebAuthn/FIDO2
  • 消息队列-ubutu22.04环境下安装
  • Vue3源码reactivity响应式篇之EffectScope
  • 从Java全栈到前端框架:一位程序员的实战之路
  • 【Java实战㉖】深入Java单元测试:JUnit 5实战指南
  • 【AI论文】Robix:一种面向机器人交互、推理与规划的统一模型
  • C++(Qt)软件调试---bug排查记录(36)
  • yolov8部署在一台无显卡的电脑上,实时性强方案
  • Alibaba Cloud Linux 3 安装Docker
  • SQL面试题及详细答案150道(61-80) --- 多表连接查询篇
  • 详细解读Docker
  • 【OJ】C++ vector类OJ题