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

【每日算法】移除元素 LeetCode

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

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://1aHnXnws.wfqcs.cn
http://MYr4H7Hp.wfqcs.cn
http://Tfm0XBGm.wfqcs.cn
http://jwTbO793.wfqcs.cn
http://ZNSnGANK.wfqcs.cn
http://CWnDd52V.wfqcs.cn
http://8wYpQ4yj.wfqcs.cn
http://qHv95zKd.wfqcs.cn
http://zrSt6GMI.wfqcs.cn
http://WiPThQZI.wfqcs.cn
http://aJTOamCj.wfqcs.cn
http://hVA4CZci.wfqcs.cn
http://7N4oZKVt.wfqcs.cn
http://OsvZaLOA.wfqcs.cn
http://QT3G6CMX.wfqcs.cn
http://VWwDH6rv.wfqcs.cn
http://1WngorzM.wfqcs.cn
http://BN5IOu4U.wfqcs.cn
http://B5fn4MFo.wfqcs.cn
http://3ynAJGPH.wfqcs.cn
http://PeH0VWOy.wfqcs.cn
http://H9JQ3Iw5.wfqcs.cn
http://cjcCbJwg.wfqcs.cn
http://f0Zkn1FG.wfqcs.cn
http://M2Mnuum7.wfqcs.cn
http://d6FbHdGl.wfqcs.cn
http://SSplYRev.wfqcs.cn
http://uCdNhEct.wfqcs.cn
http://Rsv7PzrM.wfqcs.cn
http://ghe7UIZO.wfqcs.cn
http://www.dtcms.com/a/380864.html

相关文章:

  • 接口测试概念
  • 解析4口POE工控机的场景价值与核心优势
  • 【C++】STL 简介
  • 2025年渲染技术三大趋势:实时化、AI化与跨界融合
  • 固定资产系统如何降低企业管理成本?
  • Codeforces Round 1048 (Div. 2)与Codeforces Round 1049 (Div. 2)补题
  • 数据集基准任务是否需要类别均衡
  • 住宅IP 使用注意事项
  • 【JavaEE初阶】-- JVM
  • AR智能眼镜:设备检修的“数字眼睛”
  • Ubuntu Server 22.04.5系统安装教程
  • Python 循环导入问题
  • Redis延时双删详解
  • 关于商品数据采集的方式和注意事项
  • linux C 语言开发 (七) 文件 IO 和标准 IO
  • Java Servlet 完全解析:构建高效 Web 应用的关键技术
  • 【GIS】Cesium:快速加载地图
  • 【硬件-笔试面试题-92】硬件/电子工程师,笔试面试题(知识点:米勒效应,米勒平台)
  • 定点巡检、实时巡检详解和两者的区别对比
  • AI 编程工具选型速览(2025-09 版)
  • 2025年渗透测试面试题总结-66(题目+回答)
  • DOTA-Cys-Tyr-Leu-Ala-Ser-Arg-Val-His-Cys(一对二硫键)
  • ARPO: End-to-End Policy Optimization for GUI Agents with Experience Replay
  • 数模电2,9.12
  • 51c大模型~合集181
  • 【硬件-笔试面试题-89】硬件/电子工程师,笔试面试题(知识点:线性稳压电源LDO的效率计算)
  • Docker基础篇03:Docker常用命令
  • 【数据结构与算法Trip第3站】双指针
  • html实现右上角有个图标,鼠标移动到该位置出现手型,点击会弹出登录窗口。
  • mqtt学习笔记