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

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING : DETECTING HIGH ENERGY

🌊 🌉 🌊 心手合一 · 水到渠成

|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| >>> ACCESS TERMINAL <<< ||
| 🦾 作者主页 | 🔥 C语言核心 |
| 💾 编程百度 | 📡 代码仓库 |


Running Process: 100% | Latency: 0ms


索引与导读

前言

在处理线性数据结构(数组、链表)时,传统的暴力扫描往往会带来 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. 并行指针

两个指针分别在两个不同的数据结构(比如两个独立的数组或链表)上移动。

  • 适用场景:多用于合并、比较或查找两个序列的交集。

  • 经典问题

    • 合并两个有序数组/链表:比较两个指针当前指向的值,取较小者放入新集合,并将对应的指针后移。
    • 查找两个链表的第一个公共节点。

二、双指针具体演示





三、双指针实战题目

3.1)移动零

🔗Lucy的空间骇客裂缝:leetcode原题

3.2)复写零

🔗Lucy的空间骇客裂缝:leetcode原题

3.3)快乐数

🔗Lucy的空间骇客裂缝:leetcode原题

3.4)盛最多水的容器

🔗Lucy的空间骇客裂缝:leetcode原题
🔗Lucy的空间骇客裂缝:小编讲解

3.5)有效三角形的个数

🔗Lucy的空间骇客裂缝:leetcode原题

3.6)和为 s 的两个数

🔗Lucy的空间骇客裂缝:leetcode原题

(重点) 3.7)三数之和

🔗Lucy的空间骇客裂缝:leetcode原题
🔗Lucy的空间骇客裂缝:题目讲解

(重点) 3.8)四数之和

🔗Lucy的空间骇客裂缝:leetcode原题


💻结尾--- 核心连接协议

警告: 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠


【📡】 建立深度链接: 关注本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。

【⚡】 能量过载分发: 执行点赞操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。

【💾】 离线缓存核心: 将本页加入收藏。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。

【💬】 协议加密解密:评论区留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。

【🛰️】 信号频率投票: 通过投票发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。



相关推荐
JieE21213 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack2021 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4562 天前
C++进阶(1)——前景提要
c++
用户497863050732 天前
(一)小红的数组操作
算法·编程语言