双指针方法是解决数组或链表问题中非常高效的技巧之一,尤其适用于原地修改数组减少时间复杂度的场景。以下是对双指针方法的详细讲解。

1. 双指针方法的核心思想

双指针方法通常使用两个指针(或索引)在数组或链表中协同工作,通过一次遍历完成任务。常见的双指针模式包括:

  • 快慢指针:一个指针用于遍历(快指针),另一个指针用于标记目标位置(慢指针)。
  • 左右指针:一个指针从头部开始,另一个从尾部开始,向中间移动。

在 RemoveElement 问题中,使用的是快慢指针

2. 问题描述

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

  • 空间复杂度为 O(1) (不能使用额外数组)。
  • 不需要考虑新数组长度之后的元素。

3. 双指针实现步骤

(1) 初始化指针
  • 慢指针 index :指向下一个有效元素的存储位置(初始为 0 )。
  • 快指针 i :用于遍历数组(初始为 0 )。
(2) 遍历数组
  • 快指针 i 从 0 开始,逐个检查数组元素。
  • 如果 nums[i] != val ,说明这是一个需要保留的元素:
    • 将其赋值给 nums[index] 。
    • 慢指针 index 右移一位。
  • 如果 nums[i] == val ,直接跳过(快指针继续右移)。
(3) 终止条件
  • 快指针 i 遍历完整个数组后,慢指针 index 的值即为新数组的长度。

4. 代码实现

public int RemoveElement(int[] nums, int val)
{int index = 0; // 慢指针for (int i = 0; i < nums.Length; i++) // 快指针 i{if (nums[i] != val){nums[index] = nums[i]; // 保留该元素index++; // 慢指针右移}}return index; // 新数组长度
}

5. 示例分析

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

步骤快指针 inums[i]操作数组状态慢指针 index
103跳过[3, 2, 2, 3]0
212nums[0] = 2[2, 2, 2, 3]1
322nums[1] = 2[2, 2, 2, 3]2
433跳过[2, 2, 2, 3]2

最终返回 index = 2 ,新数组为 [2, 2, ...] (后续元素无需关心)。

6. 复杂度分析

  • 时间复杂度: O(n) ,只需遍历一次数组。
  • 空间复杂度: O(1) ,仅使用常数级别的额外空间。

7. 双指针的适用场景

  1. 原地修改数组:如删除重复项、移除特定元素。
  2. 链表问题:如判断环形链表、找到中间节点。
  3. 有序数组:如两数之和、合并有序数组。

8. 总结

双指针方法是解决数组/链表问题的利器,核心在于:

  • 明确指针的分工(快指针遍历,慢指针标记)。
  • 注意边界条件(如空数组、全部元素需删除)。
  • 灵活选择变体(如交换法优化)。

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

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

相关文章

Android 项目:画图白板APP开发(六)——分页展示

本篇将介绍如何为我们的画板应用添加分页展示功能&#xff0c;让用户可以创建多个画布并在它们之间轻松切换。这章没有啥知识点的讲解&#xff0c;主要介绍一下每页保存的数据结构是什么样的。 一、ListView 多页数据的管理我们使用ListView。之前有文章讲过ListView这里就不多…

智能眼镜产品成熟度分析框架与评估

引言 当前(2025年9月12日),智能眼镜(Smart Glasses)市场正处于快速演进阶段,从早期的新奇设备向主流消费电子转型。AI整合、AR显示和多模态交互的进步推动了这一转变。根据最新数据,2025年AI眼镜发货量预计达686万台,同比增长265%,全球市场规模从2024年的约19.3亿美元…

(网络编程)网络编程套接字 UDP的socket API 代码解析

网络编程基础 为什么需要网络编程?--丰富的网络资源 用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。与本地打开视频文件类似,只是视频文件这个资源的来源是网络。 相比本地资源来说,网络提供了更为丰富的网络资源:所谓的网络资源…

【STM32】状态机(State Machine)

这篇博客介绍 状态机&#xff08;State Machine&#xff09;&#xff0c;适合用于嵌入式开发、驱动开发、协议解析、按键识别等多种场景。 一、什么是状态机&#xff08;State Machine&#xff09;&#xff1f; 状态机&#xff08;State Machine&#xff09;是一种用于描述系统…

深度学习在离岗检测中的应用

离岗检测技术正逐步成为现代企业精细化管理和安全生产的重要工具。这项基于计算机视觉和人工智能的应用&#xff0c;通过自动化、实时化的监测方式&#xff0c;有效提升了工作纪律性和运营效率&#xff0c;为项目管理者和企业提供了创新的监管解决方案。在许多工作场景中&#…

Spring缓存(二):解决缓存雪崩、击穿、穿透问题

1. 缓存穿透问题与解决方案 1.1 什么是缓存穿透 缓存穿透是指查询一个不存在的数据&#xff0c;由于缓存中没有这个数据&#xff0c;每次请求都会直接打到数据库。 如果有恶意用户不断请求不存在的数据&#xff0c;就会给数据库带来巨大压力。 这种情况下&#xff0c;缓存失去了…

PHP 与 WebAssembly 的 “天然隔阂”

WebAssembly&#xff08;简称 WASM&#xff09;是一种低级二进制指令格式&#xff0c;旨在为高级语言提供高性能的编译目标&#xff0c;尤其在浏览器环境中实现接近原生的执行效率。它主要用于前端性能密集型场景&#xff08;如游戏引擎、视频编解码、3D 渲染等&#xff09;&am…

unity中通过拖拽,自定义scroll view中子物体顺序

1.在每个content的子物体上挂载DragHandler脚本&#xff0c;并且添加Canvs Group组件&#xff0c;设置见图2.DragHandler脚本内容&#xff1a;using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using System.Coll…

用 Matplotlib 绘制饼图:从基础语法到实战美化,全面掌握分类数据可视化技巧

用 Matplotlib 绘制饼图:从基础语法到实战美化,全面掌握分类数据可视化技巧 在数据分析与可视化的世界里,**“图胜千言”**早已成为共识。而在众多图表类型中,饼图(Pie Chart)以其直观的比例展示方式,成为展示分类数据分布的常见选择。无论是业务报表、用户画像,还是市…

基础算法之二分算法 --- 2

大家好&#xff0c;不同的时间&#xff0c;相同的地点&#xff0c;时隔多日我们又见面了。继上次的二分算法后&#xff0c;我们这次要来学习的是二分答案了。这个部分相较于前面的二分算法难度有相当的提升&#xff0c;希望大家有所准备。虽然难度增加了&#xff0c;但是博主还…

发挥nano banana的最大能力

1. 概述Nano Banana 简介&#xff1a;Nano Banana 是 Google DeepMind 开发的 AI 图像生成与编辑模型&#xff0c;集成在 Google Gemini 平台中&#xff08;具体为 Gemini 2.5 Flash 版本&#xff09;。它以高效的图像编辑能力闻名&#xff0c;尤其在角色一致性、光影理解和快速…

leetcode 面试题01.02判定是否互为字符重排

一、问题描述二、解题思路解法一&#xff1a;对s1和s2进行sort排序&#xff0c;返回s1是否等于s2&#xff1b;解法二&#xff1a;用哈希表分别来记录s1和s2中字符出现的次数&#xff0c;统计完后&#xff0c;判断两个哈希表是否相等;三、代码实现解法一&#xff1a;时间复杂度&…

Python Yolo8 物体识别

支持单张图片/图片目录批量预标注 默认使用cuda GPU .env HTTP_PROXYhttp://192.168.2.109:10808 HTTPS_PROXYhttp://192.168.2.109:10808pyproject.toml [project] name "yolo-test" version "0.1.0" description "Add your description here&quo…

LeetCode100-234回文链表

本文基于各个大佬的文章上点关注下点赞&#xff0c;明天一定更灿烂&#xff01;前言Python基础好像会了又好像没会&#xff0c;所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考&#xff0c;写给自己看的&#xff0c;也欢迎大家在评论区指导…

BUG排查流程

引言简述Bug排查的重要性分享个人或团队在Bug排查中的常见挑战引出日记形式记录的价值日记格式设计时间戳&#xff1a;记录问题发现和解决的时间节点问题描述&#xff1a;清晰定义Bug的现象和影响范围环境信息&#xff1a;操作系统、版本号、依赖库等关键配置复现步骤&#xff…

汽车功能安全 Functional Safety ISO 26262 测试之一

汽车电子电气系统的日益复杂使得功能安全成为保障车辆可靠性和驾乘安全的关键。 本文将围绕ISO 26262标准的核心内容展开&#xff0c;帮助大家理解如何通过系统化的方法控制风险&#xff0c;进行测试&#xff0c;确保产品安全。 01 什么是功能安全&#xff1f; 首先&#xff0c…

人形机器人赛道的隐形胜负手:低延迟视频链路如何决定机器人未来

一、引言&#xff1a;爆发前夜的人形机器人赛道 2025 年&#xff0c;被业内称为“人形机器人量产元年”。政策与资本的合力&#xff0c;让这条原本还带着科幻色彩的产业赛道&#xff0c;骤然进入现实加速期。国家层面&#xff0c;《“机器人”行动计划》明确提出要推动人形机器…

从iPhone 17取消SIM卡槽,看企业如何告别“数据孤岛”

9月10日&#xff0c;苹果公司如期召开秋季新品发布会&#xff0c;正式推出iPhone 17系列。除了性能和拍照的常规升级&#xff0c;一个看似不起眼但意义深远的改变引起了广泛关注——iPhone 17 Pro系列全面取消了实体SIM卡槽&#xff0c;只保留了eSIM功能。这一举动不仅仅是技术…

【JavaWeb01】Web介绍

文章目录1.导学2.Web开发介绍2.1 Web网站的工作流程2.2 前后端分离开发1.导学 2.Web开发介绍 2.1 Web网站的工作流程 浏览器根据请求的域名请求对应的前端服务器&#xff0c;前端服务器接收到请求之后&#xff0c;把对应的前端代码返回给服务器。浏览器中有解析前端代码的解析引…

链路预测算法MATLAB实现

链路预测算法MATLAB实现 链路预测是复杂网络分析中的重要任务&#xff0c;旨在预测网络中尚未连接的两个节点之间未来产生连接的可能性。 程序概述 MATLAB程序实现了以下链路预测算法&#xff1a; 基于局部信息的相似性指标&#xff08;Common Neighbors, Jaccard, Adamic-Adar…