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

  📝 题目:移除元素

  题目描述: 给定数组和值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://www.pswp.cn/web/96020.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96020.shtml

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

相关文章

10 【C++】泛型编程

文章目录前言泛型编程&#xff08;模板&#xff09;1. 函数模板1.1 函数模板格式1.2 函数模板的实例化隐式实例化显式指定模板参数实例化1.3 函数模板实例化的原理1.4 模板参数的匹配原则2. 类模板2.1 类模板的格式2.2 类模板的实例化2.3 类模板实例化的原理2.4 类模板的匹配原…

【基于YOLO和Web的交通工具识别系统】

系统功能 视频检测&#xff1a;对输入的视频流进行实时或离线分析&#xff0c;自动识别视频中出现的交通工具&#xff08;如飞机、自行车等&#xff09;及行人&#xff0c;输出包含目标类别、位置等信息的检测结果。摄像检测&#xff1a;通过连接摄像头设备&#xff0c;对实时…

Python进程,线程

目录 一、多任务 1.1定义 1.2具体体现 1.3并发和并行 1.3.1并发操作 1.3.2并行操作 1.3.3对比 二、进程 2.1概念 2.2特点 2.3进程状态 2.4多进程 2.5多进程实现 2.6进程锁 三、线程 3.1概念 3.2特点 3.3适用场景 3.4多线程实现 四、对比 4.1关系对⽐ 4.2区…

【Element Plus 表单组件样式统一 CSS 文字特效实现指南】

Element Plus 表单组件样式统一 & CSS 文字特效实现指南 前言 在使用 Element Plus 组件库开发表单页面时&#xff0c;我们遇到了一个看似简单却很有趣的问题&#xff1a;el-input、el-select 和 el-textarea 在禁用状态下的文字颜色不一致。通过深入研究&#xff0c;我们…

网络通信与协议栈 -- OSI,TCP/IP模型,协议族,UDP编程

网络通信的核心是实现不同主机上进程间的数据交换&#xff0c;其技术体系围绕 “协议分层模型” 展开&#xff0c;向下依赖硬件介质传输电 / 光信号&#xff0c;向上支撑各类网络应用&#xff08;如网页浏览、文件传输&#xff09;。本文结合 OSI 理论框架与 TCP/IP 工业标准&a…

HarmonyOS 新一代声明式 UI 弹窗机制:从 AlertDialog 到 CustomDialogController 的深度解析与实践

好的&#xff0c;请看这篇关于 HarmonyOS 新一代声明式 UI 弹窗机制的技术文章。 HarmonyOS 新一代声明式 UI 弹窗机制&#xff1a;从 AlertDialog 到 CustomDialogController 的深度解析与实践 引言 在 HarmonyOS 应用开发中&#xff0c;弹窗&#xff08;Dialog&#xff09;是…

混合推理模型(快思考、慢思考模型)

目录基础transformer架构、transformers库预训练模型的微调&#xff08;Fine-tuning&#xff09;预训练微调的大模型应用模式base 模型、instruct 模型区别Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安装 # 1,下载 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面机装备中的应用

随着食品加工行业向自动化、智能化转型&#xff0c;面机装备对控制系统的响应速度、布线灵活性及稳定性提出了更高要求。本案例以某大型食品机械制造企业的全自动面条生产线升级项目为背景&#xff0c;引入 MR30 分布式 IO 模块替代传统集中式 IO 方案。通过将 MR30 分布式 IO …

Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战

Matlab使用小技巧合集(系列四):Table类型高效用法与数据处理实战 在科研数据处理和论文写作过程中,结构化数据的管理极为重要。Matlab的table类型为研究生和科研人员提供了灵活、高效的数据存储与处理方式,尤其适合实验结果整理、分组统计、数据预处理等场景。本文将系统介…

STM32的时钟系统与时钟树的配置

STM32的时钟系统是其微控制器&#xff08;MCU&#xff09;的核心组成部分&#xff0c;负责为CPU、外设和存储器等模块提供精确的时序信号。其设计灵活且复杂&#xff0c;通过多级时钟树&#xff08;Clock Tree&#xff09;实现时钟源的选择、分频和分配。以下是详细介绍&#x…

NV 工具metrics分析(ncu, nsys/torch profiler)

以下分析都以A100硬件架构为例; Theoretical Max Active Warps per SM: 64 Register number: 512 (规定每个thread不能超过256) Theoretical Active Warps per SM [warp]&#xff1a;512//registers_per_thread*4, which defines theoretical active warp occupancy Waves P…

[CISCN2019 总决赛 Day2 Web1]Easyweb

登录界面可以看到随机切换的图片。从页面源码中可以看到<div class"avtar"><img src"image.php?id3" width"200" height"200"/></div>&#xff0c;图片文件的请求地址&#xff0c;并且有传参id。web应用中像这种动…

第 3 讲:KAFKA生产者(Producer)详解

这是一篇既照顾入门也能给高级工程师提供落地经验的实战笔记。0. TL;DR&#xff08;先上结论&#xff09; 想稳&#xff1a;acksall 合理 retries&#xff1b;需要“分区内不重不丢”→ 再加 enable.idempotencetrue 且 max.in.flight<5。想快&#xff1a;适度增大 batch.s…

微信小程序截屏与录屏功能详解

微信小程序提供了丰富的API支持截屏和录屏功能&#xff0c;适用于多种场景&#xff0c;如教育类应用的课程录制、游戏类应用的精彩瞬间分享、电商类应用的商品展示等。以下将详细介绍实现方法和应用案例。 截屏功能实现 截屏功能通过调用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

写在前面 在函数式组件主导的 React 项目中&#xff0c;高阶组件&#xff08;HOC&#xff09;并非首选推荐&#xff0c;更建议优先使用 Hooks来实现复用逻辑。核心原因是 HOC 存在固有的设计缺陷&#xff0c;而 Hooks 能更优雅、简洁地解决相同问题&#xff0c;同时避免 HOC 的…

【 苍穹外卖 | Day2】

1. 相关视频 Day2的全部视频集数 2. 学习记录 2.1 对象属性拷贝 当DTO与实体类或者VO对象之间的一个装换的时候&#xff0c;如果通过new创建对象&#xff0c;然后调用set方法进行属性赋值&#xff0c;不够方便&#xff0c;代码不够简洁。当属性过多时候&#xff0c;代码就会…

焊接自动化测试平台图像处理分析-模型训练推理

1、使用技术栈&#xff1a;jdk17/springboot/python/opencv/yolov8 2、JAVA环境搭建 JDK17下载安装&#xff1a;wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解压软件 tar -xf jdk-17.0.16_linux-x64_bin.tar.gz 配置全局变量 vim /etc/p…

【python实用小脚本-205】[HR揭秘]手工党逐行查Bug的终结者|Python版代码质量“CT机”加速器(建议收藏)

1. 场景故事 “作为HR&#xff0c;我曾用2小时逐行审阅50份Python简历项目&#xff0c;直到发现候选人的代码复杂度超标导致线上事故…” → 转折点&#xff1a;用麦凯布&#xff08;McCabe&#xff09;圈复杂度检测脚本&#xff0c;30秒扫描全仓库&#xff0c;现可100%拦截“高…

LeetCode - 1089. 复写零

题目 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 思路 这道题我首先想到的是从前往后双指针&#xff0c;但是这样做会造成数据的覆盖&#xff0c;比如说下面的这个情况 所以解决的方法就是从后往前去复写&#xff0c;但是从后往前的话就要知道最后一个有效元素是…