
⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///
WARNING : DETECTING HIGH ENERGY
🌊 🌉 🌊 心手合一 · 水到渠成

|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| >>> ACCESS TERMINAL <<< ||
| 🦾 作者主页 | 🔥 C语言核心 |
| 💾 编程百度 | 📡 代码仓库 |
Running Process: 100% | Latency: 0ms
索引与导读
- 前言
-
- 一、双指针算法的原理
- 二、双指针具体演示
- 三、双指针实战题目
-
- 3.1)移动零
- 3.2)复写零
- 3.3)快乐数
- 3.4)盛最多水的容器
- 3.5)有效三角形的个数
- [3.6)和为 s 的两个数](#3.6)和为 s 的两个数)
- [(重点) 3.7)三数之和](#(重点) 3.7)三数之和)
- [(重点) 3.8)四数之和](#(重点) 3.8)四数之和)
- [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议)
前言
在处理线性数据结构(数组、链表)时,传统的暴力扫描往往会带来 O ( n 2 ) O(n^2) O(n2) 的时间复杂度。 对于高频并发或大规模数据处理,这种效率是无法接受的。
双指针 是经常被用来将嵌套循环转化为单循环,从而将时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降至 O ( N ) O(N) O(N),是避免 TLE(Time Limit Exceeded)的利器
一、双指针算法的原理
- 核心原理: 使用
两个变量(通常作为数组的索引或链表的指针) 在数据结构上进行协同遍历,根据特定的条件控制指针的移动,直到找到满足条件的解或遍历完成
问题一:双指针是否是真的指针变量?
在大多数情况下,"双指针"中的"指针"并不是编程语言层面上的那个"指针变量",而是一个逻辑上的概念
在算法理论中,"指针"指的是指向某种数据的索引或引用
它的核心作用是 "定位"
- 在数组中:"指针"通常只是整数索引(
int index)。
例如:
c
int left = 0; int right = n - 1;
这里的 left 和 right 是普通整数,
但因为它们指示了数组的位置,所以我们逻辑上称之为指针
- 在链表中:"指针"则是真实的内存地址指针
c
ListNode *fast = head; ListNode *slow = head;
这里的 fast 是一个真正的指针变量,存储的是内存地址。
这其实是一种约定俗成
无论是在 C++ 里操作内存地址,还是在 Python 里操作数组下标,它们在执行双指针算法时的思维模型是一致的:
-
定位: 标记当前关注的数据位置。
-
移动: 根据条件改变标记的位置。
-
协同: 两个标记互相关联以缩小搜索空间。
问题二:双指针的分类
1. 对撞指针(左右指针)
这是最常见的形式。两个指针分别位于线性结构(如数组或字符串)的两端,并根据条件向中间移动,直到两个指针相遇或交叉。
- 适用场景:通常用于有序数组或字符串的搜索问题。
- 经典问题 :
- 两数之和 II(输入有序数组):判断数组中是否有两个数的和等于目标值。如果当前和小于目标值,左指针右移(增大和);如果大于目标值,右指针左移(减小和)。
- 反转字符串/数组:左右指针不断交换元素并向中间靠拢。
- 盛最多水的容器:贪心策略,每次移动高度较小的那个指针。
2. 快慢指针(同向指针)
两个指针都从同一端出发,但以不同的速度或不同的步长向前移动。
-
适用场景:多用于处理链表问题,或者数组中的原地修改问题。滑动窗口(Sliding Window)本质上也是一种高级的同向双指针。
-
经典问题:
- 判断链表是否有环:弗洛伊德循环查找算法(龟兔赛跑),快指针每次走两步,慢指针每次走一步。如果有环,它们一定会相遇。
- 寻找链表的中点:快指针走完时,慢指针刚好在中间。
- 删除有序数组中的重复项:慢指针指向构建好的无重复数组的末尾,快指针去寻找下一个不同的元素。
3. 并行指针
两个指针分别在两个不同的数据结构(比如两个独立的数组或链表)上移动。
-
适用场景:多用于合并、比较或查找两个序列的交集。
-
经典问题:
- 合并两个有序数组/链表:比较两个指针当前指向的值,取较小者放入新集合,并将对应的指针后移。
- 查找两个链表的第一个公共节点。
二、双指针具体演示





三、双指针实战题目
3.1)移动零
3.2)复写零
3.3)快乐数
3.4)盛最多水的容器
3.5)有效三角形的个数
3.6)和为 s 的两个数
(重点) 3.7)三数之和
(重点) 3.8)四数之和
💻结尾--- 核心连接协议
警告: 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠
【📡】 建立深度链接: 关注本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。
【⚡】 能量过载分发: 执行点赞操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。
【💾】 离线缓存核心: 将本页加入收藏。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。
【💬】 协议加密解密: 在评论区留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。
【🛰️】 信号频率投票: 通过投票发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。

