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

⚡ 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原题


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

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


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

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

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

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

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



相关推荐
Dillon Dong1 小时前
【风电控制】TI TMS320F28379D 双CPU架构解析与任务分布设计
嵌入式硬件·算法·变流器·风电控制
NiceCloud喜云6 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
小羊在睡觉7 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
cjhbachelor7 小时前
c++继承
c++
3DVisionary7 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记7 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_468466857 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
肩上风骋7 小时前
C++14特性
开发语言·c++·c++14特性
_日拱一卒7 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM8 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法