【优化算法】双指针算法的「义体化」重构 ——【双指针】双指针算法中的指针是如何定义的?如何使用它进行一些简单的算法?

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING \]: DETECTING HIGH ENERGY **🌊 🌉 🌊 心手合一 · 水到渠成** ![分隔符](https://i-blog.csdnimg.cn/direct/60a3de2294e9439abad47378e657b337.gif) |------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | **\>\>\> ACCESS TERMINAL \<\<\<** || | [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) | | [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) | --------------------------------------- Running Process: 100% \| Latency: 0ms *** ** * ** *** #### 索引与导读 * [前言](#前言) * * [一、双指针算法的原理](#一、双指针算法的原理) * * [问题一:双指针是否是真的指针变量?](#问题一:双指针是否是真的指针变量?) * [问题二:双指针的分类](#问题二:双指针的分类) * [二、双指针具体演示](#二、双指针具体演示) * [三、双指针实战题目](#三、双指针实战题目) * * [3.1)移动零](#3.1)移动零) * [3.2)复写零](#3.2)复写零) * [3.3)快乐数](#3.3)快乐数) * [3.4)盛最多水的容器](#3.4)盛最多水的容器) * [3.5)有效三角形的个数](#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. 定位: 标记当前关注的数据位置。 2. 移动: 根据条件改变标记的位置。 3. 协同: 两个标记互相关联以缩小搜索空间。 *** ** * ** *** #### 问题二:双指针的分类 `1`. 对撞指针(左右指针) 这是最常见的形式。两个指针分别位于线性结构(如数组或字符串)的两端,并根据条件向中间移动,直到两个指针相遇或交叉。 * **适用场景**:通常用于有序数组或字符串的搜索问题。 * **经典问题** : * 两数之和 II(输入有序数组):判断数组中是否有两个数的和等于目标值。如果当前和小于目标值,左指针右移(增大和);如果大于目标值,右指针左移(减小和)。 * 反转字符串/数组:左右指针不断交换元素并向中间靠拢。 * 盛最多水的容器:贪心策略,每次移动高度较小的那个指针。 `2`. 快慢指针(同向指针) 两个指针都从同一端出发,但以不同的速度或不同的步长向前移动。 * **适用场景**:多用于处理链表问题,或者数组中的原地修改问题。滑动窗口(Sliding Window)本质上也是一种高级的同向双指针。 * **经典问题**: * 判断链表是否有环:弗洛伊德循环查找算法(龟兔赛跑),快指针每次走两步,慢指针每次走一步。如果有环,它们一定会相遇。 * 寻找链表的中点:快指针走完时,慢指针刚好在中间。 * 删除有序数组中的重复项:慢指针指向构建好的无重复数组的末尾,快指针去寻找下一个不同的元素。 `3`. 并行指针 两个指针分别在两个不同的数据结构(比如两个独立的数组或链表)上移动。 * **适用场景**:多用于合并、比较或查找两个序列的交集。 * **经典问题**: * 合并两个有序数组/链表:比较两个指针当前指向的值,取较小者放入新集合,并将对应的指针后移。 * 查找两个链表的第一个公共节点。 *** ** * ** *** ### 二、双指针具体演示 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0b55b0ca8987478b8b211c5d82ccf99f.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9b01d480bf30473fa199812be2673089.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3e1a836279554bcdb8161d991cb4eea1.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7e429ccd694f4ba6bbd56c1311ceb9f9.png) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9336fb47a93b4395b53de864f9bc1488.png) *** ** * ** *** ### 三、双指针实战题目 #### 3.1)移动零 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/move-zeroes/description/) #### 3.2)复写零 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/duplicate-zeros/) #### 3.3)快乐数 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/happy-number/description/) #### 3.4)盛最多水的容器 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/container-with-most-water/description/) > [🔗Lucy的空间骇客裂缝:小编讲解]() #### 3.5)有效三角形的个数 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/valid-triangle-number/) #### 3.6)和为 s 的两个数 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/description/) #### (重点) 3.7)三数之和 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/3sum/description/) > [🔗Lucy的空间骇客裂缝:题目讲解](https://blog.csdn.net/fengtinghuqu520/article/details/160509232?spm=1011.2415.3001.10575&sharefrom=mp_manage_link) #### (重点) 3.8)四数之和 > [🔗Lucy的空间骇客裂缝:leetcode原题](https://leetcode.cn/problems/4sum/) *** ** * ** *** ## 💻结尾--- 核心连接协议 **警告:** 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠 *** ** * ** *** **【📡】 建立深度链接:** **关注**本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。 **【⚡】 能量过载分发:** 执行**点赞**操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。 **【💾】 离线缓存核心:** 将本页加入**收藏**。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。 **【💬】 协议加密解密:** 在**评论区**留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。 **【🛰️】 信号频率投票:** 通过**投票**发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。 *** ** * ** *** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57b03915c54b43a7a03fa92dbbfe57c3.gif) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0905dc972de8414bb602715de3f866ee.gif)

相关推荐
通信小呆呆2 小时前
ZC序列符号同步:多径信道下的四种经典算法
算法
小辉同志2 小时前
62. 不同路径
c++·力扣·多维动态规划
机器学习之心HML2 小时前
粒子群算法求解速冻食品冷链配送路径优化问题,MATLAB代码
算法·matlab·冷链配送路径优化
fie88892 小时前
基于粒子群优化(PSO)算法的带STATCOM的IEEE 30节点系统最优潮流MATLAB实现
开发语言·算法·matlab
arron88992 小时前
DebugView未打印日志原因
c++
hele_two2 小时前
SDL2高效画实心圆的算法(一)
c++·算法·图形渲染
cheems95272 小时前
[算法手记] 动态规划,二叉树计数问题
算法·动态规划
贫民窟的勇敢爷们2 小时前
Scikit-learn算法:从入门到精通的机器学习工具箱
算法·机器学习·scikit-learn
Liangwei Lin3 小时前
LeetCode 155. 最小栈
java·javascript·算法