双指针法高效解决「移除元素」问题

双指针法高效解决「移除元素」问题

  • 双指针法高效解决「移除元素」问题
    • 一、问题描述
    • 二、解法解析:双指针法
      • 1. 核心思想
      • 2. 算法步骤
      • 3. 执行过程示例
    • 三、关键点分析
    • 四、复杂度分析
    • 五、与其他解法的比较
      • 1. 快慢指针法
      • 2. 本解法的优势
    • 六、实际应用场景
    • 七、总结


双指针法高效解决「移除元素」问题

一、问题描述

给定一个整数数组 nums 和一个整数 val,我们需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。要求:

  • 必须原地修改输入数组
  • 不需要考虑数组中超出新长度后面的元素
  • 空间复杂度应为 O(1)

二、解法解析:双指针法

1. 核心思想

采用首尾双指针策略:

  • left 指针从数组头部开始,负责构建新数组
  • right 指针从数组尾部开始,提供替换元素

2. 算法步骤

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;  // left即为新长度
}

3. 执行过程示例

nums = [3,2,2,3], val = 3 为例:

  1. 初始状态:[3,2,2,3], left=0, right=3
  2. nums[0]==3 → 替换为nums[3] → [3,2,2,3], right=2
  3. nums[0]==3 → 替换为nums[2] → [2,2,2,3], right=1
  4. nums[0]==2 → left=1
  5. nums[1]==2 → left=2
  6. left>right 循环结束
  7. 返回 left=2,新数组为 [2,2,...]

三、关键点分析

  1. 边界条件while (left <= right) 确保处理所有元素
  2. 元素交换:发现目标值时直接覆盖而非交换,减少操作
  3. 指针移动
    • 只有确认当前元素不是目标值时才移动左指针
    • 每次覆盖操作后右指针必定左移

四、复杂度分析

指标说明
时间复杂度O(n)最多遍历数组一次
空间复杂度O(1)只使用了常数级别的额外空间

五、与其他解法的比较

1. 快慢指针法

int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] != val) {nums[slow++] = nums[fast];}
}
return slow;
  • 更适合目标值较少的情况
  • 元素移动次数可能更多

2. 本解法的优势

  • 在目标值较多时效率更高
  • 每个目标值只需一次赋值操作
  • 保留了数组末端的原有元素

六、实际应用场景

这种双指针技巧适用于:

  1. 需要原地修改数组的问题
  2. 需要保持部分元素顺序的问题
  3. 资源受限环境下的数组操作

七、总结

这种首尾双指针解法:

  1. 是处理数组原地修改的高效方法
  2. 通过巧妙地指针移动减少不必要的操作
  3. 体现了算法设计中空间换时间的思想
  4. 需要熟练掌握指针边界条件的控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83894.shtml

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

相关文章

知识图谱构架

目录 知识图谱构架 一、StanfordNLP 和 spaCy 工具介绍 &#xff08;一&#xff09;StanfordNLP 主要功能 使用示例 &#xff08;二&#xff09;spaCy 主要功能 使用示例 二、CRF 和 BERT 的基本原理和入门 &#xff08;一&#xff09;CRF&#xff08;条件随机场&…

激光三角测量标定与应用

文章目录 1&#xff0c;介绍。2&#xff0c;技术原理3&#xff0c;类型。3.1&#xff0c;直射式3.2&#xff0c;斜射式3.3&#xff0c;两种三角位移传感器特性的比较 4&#xff0c;什么是光片&#xff1f;5&#xff0c;主要的算子。1&#xff0c;create_sheet_of_light_model2&…

高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案

引言&#xff1a;消息队列的“不可替代性” 在微服务架构和分布式系统盛行的今天&#xff0c;消息队列&#xff08;Message Queue&#xff09; 已成为解决系统解耦、流量削峰、异步处理等难题的核心组件。然而&#xff0c;传统的自建消息队列&#xff08;如RabbitMQ、Kafka&am…

人工智能核心知识:AI Agent 的四种关键设计模式

人工智能核心知识&#xff1a;AI Agent 的四种关键设计模式 一、引言 在人工智能领域&#xff0c;AI Agent&#xff08;人工智能代理&#xff09;是实现智能行为和决策的核心实体。它能够感知环境、做出决策并采取行动以完成特定任务。为了设计高效、灵活且适应性强的 AI Age…

平替BioLegend品牌-Elabscience PE Anti-Mouse Foxp3抗体:流式细胞术中的高效工具,助力免疫细胞分析!”

概述 调节性T细胞&#xff08;Treg&#xff09;在维持免疫耐受和抑制过度免疫反应中发挥关键作用&#xff0c;其标志性转录因子Foxp3&#xff08;Forkhead box P3&#xff09;是Treg功能研究的重要靶点。Elabscience 推出的抗小鼠Foxp3抗体&#xff08;3G3-E&#xff09;&…

编程日志5.13

邻接表的基础代码 #include<iostream> using namespace std; //邻接表的类声明 class Graph {private: //结构体EdgeNode表示图中的边结点,包含顶点vertex、权重weight和指向下一个边结点的指针next struct EdgeNode { int vertex; int weight; …

PowerBI 矩阵实现动态行内容(如前后销售数据)统计数据,以及过滤同时为0的数据

我们有一张活动表 和 一张销售表 我们想实现如下的效果&#xff0c;当选择某个活动时&#xff0c;显示活动前后3天的销售对比图&#xff0c;如下&#xff1a; 实现方法&#xff1a; 1.新建一个表&#xff0c;用于显示列&#xff1a; 2.新建一个度量值&#xff0c;用SELECTEDVA…

Prompt Tuning:高效微调大模型的新利器

Prompt Tuning(提示调优)是什么 Prompt Tuning(提示调优) 是大模型参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)的重要技术之一,其核心思想是通过优化 连续的提示向量(而非整个模型参数)来适配特定任务。以下是关于 Prompt Tuning 的详细解析: 一、核心概念…

杰发科技AC7840——如何把结构体数据写到Dflash中

1. 结构体数据被存放在Pflash中 正常情况下&#xff0c;可以看到全局变量的结构体数据被存放在Pflash中 数字部分存在RAM中 2. 最小编程单位 8字节编程&#xff0c;因此如果结构体存放在Dfalsh中&#xff0c;进行写操作&#xff0c;需要写8字节的倍数 第一种办法&#xff1a;…

CSS 选择器入门

一、CSS 选择器基础&#xff1a;快速掌握核心概念 什么是选择器&#xff1f; CSS 选择器就像 “网页元素的遥控器”&#xff0c;用于定位 HTML 中的特定元素并应用样式。 /* 结构&#xff1a;选择器 { 属性: 值; } */ p { color: red; } /* 选择所有<p>元素&#xff0c;…

Anaconda3安装教程(附加安装包)Anaconda详细安装教程Anaconda3 最新版安装教程

多环境隔离 可同时维护生产环境、开发环境、测试环境&#xff0c;例如&#xff1a; conda create -n ml python3.10 # 创建机器学习环境 conda activate ml # 激活环境三、Anaconda3 安装教程 解压Anaconda3安装包 找到下载的 Anaconda3 安装包&#xff08;.ex…

现代计算机图形学Games101入门笔记(十七)

双向路径追踪 外观建模 散射介质 人的头发不能用在动画的毛发上。 动物的髓质Medulla特别大 双层圆柱模型应用 BSSRDF是BRDF的延伸。 天鹅绒用BRDF不合理&#xff0c;转成散射介质。 法线分布 光追很难处理微表面模型 光在微型细节上&#xff0c;光是一个波&#xff0c;会发生衍…

chrome源码中WeakPtr 跨线程使用详解:原理、风险与最佳实践

base::WeakPtr 在 Chromium 中 不能安全地跨线程使用。这是一个很关键的点&#xff0c;下面详细解释原因及正确用法。 &#x1f50d;原理与使用 ✅ 先说答案&#xff1a; base::WeakPtr 本质上是**线程绑定&#xff08;thread-affine&#xff09;**的。不能在多个线程之间创建…

hysAnalyser 从MPEG-TS导出ES功能说明

摘要 hysAnalyser 是一款特色的 MPEG-TS 数据分析工具。本文主要介绍了 hysAnalyser 从MPEG-TS 中导出选定的 ES 或 PES 功能(版本v1.0.003)&#xff0c;以便用户知悉和掌握这些功能&#xff0c;帮助分析和解决各种遇到ES或PES相关的实际问题。hysAnalyser 支持主流的MP1/MP2/…

C++(21):fstream的读取和写入

目录 1 ios::out 2 ios::in和is_open 3 put()方法 4 get()方法 4.1 读取单个字符 4.2 读取多个字符 4.3 设置终结符 5 getline() 1 ios::out 打开文件用于写入数据。如果文件不存在&#xff0c;则新建该文件&#xff1b;如果文件原来就存在&#xff0c;则打开时清除…

系统架构设计(十七):微服务数据一致性和高可用策略

数据一致性问题 问题本质 由于每个微服务拥有独立数据库&#xff0c;跨服务操作不能用传统的数据库事务&#xff0c;面临“分布式事务”一致性挑战。 数据一致性策略 策略核心思想应用场景优缺点强一致性&#xff08;Strong Consistency&#xff09;所有操作实时同步成功&a…

os agent智能体软件 - 第三弹 - 纯语音交互

前两期期我们发布了产品的初级形态&#xff0c;那时候还只能是“软件开发者”在本地配置使用&#xff0c;或者运行起来有个大黑框&#xff0c;使用起来美观度太差。 到今天大概20天&#xff0c;我们的第3版已经出来了&#xff0c;不仅做成了电脑端的exe软件&#xff08;任何人…

链表原理与实现:从单链表到LinkedList

1.链表的概念及结构 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 可以形象的理解&#xff0c;在逻辑上来看&#xff0c;链表就像是一节节火车车厢。 链表的分类&#xff1a;链表的结构有很多种&#xff0c;单向…

替换word中的excel

PostMapping("/make/report/target/performance/first") public AjaxResult makeTargetReportFirst(RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap new HashMap<>();// 替换日期LocalDateTime nowData LocalDateTime…

深入探索百度智能云千帆AppBuilder:从零开始构建AI应用

在数字化转型的浪潮中&#xff0c;企业对高效、智能的应用开发平台的需求日益增长。百度智能云千帆AppBuilder&#xff08;以下简称AppBuilder&#xff09;凭借其强大的功能和灵活的开发方式&#xff0c;成为企业级大模型应用开发的理想选择。本文将详细介绍如何使用AppBuilder…