注:双指针是个模型,不局限于必须两个指针,三个、四个指针也是一样的,本质在于降低暴力求解的时间复杂度,以下的双指针模型时间复杂度均为O(N)

思维导图概览

同向双指针

大多利用到数的单调性(需有序)或正负性

例题:

优选算法-双指针:2.复写零(重点题)

👆归纳原因:利用位置性:直接定位到最终位置,反遍历

B.双指针——1346. 检查整数及其两倍数是否存在

👆归纳原因:利用单调性+正负性第一次正遍历找正数的(负数自动跳过),另一次反遍历找负数的(正数自动跳过)

明显利用单调性的:

B.双指针——88. 合并两个有序数组

B.双指针——349. 两个数组的交集

B.双指针——350. 两个数组的交集 II

B.双指针——2367. 等差三元组的数目

B.双指针——2540. 最小公共值

B.双指针——2570. 合并两个二维数组 - 求和法

明显利用位置性的:

B.双指针——922. 按奇偶排序数组 II

B.双指针——2200. 找出数组中的所有 K 近邻下标

①分区间处理

分区间处理:[0,dest][dest+1,cur-1][cur+1,n-1] ​

分别是[已处理的非0][已处理的0][待处理]

例题:

优选算法-双指针:1.移动零(重点题)

B.双指针——2460. 对数组执行操作

B.双指针——2903. 找出满足差值条件的下标 I

👆归纳原因:找到两个指针下标所在区间加以判断

B.双指针——2970. 统计移除递增子数组的数目 I

👆归纳原因:分为[递增区间][可移除递增子数组][递增区间]

B.双指针——2972. 统计移除递增子数组的数目 II

👆归纳原因:思路跟2970一摸一样

②快慢双指针

主要用于找中点判断

例题:

优选算法-双指针:3.快乐数(重点题)

👆归纳原因:通过快慢指针的相遇点判断快乐数

③求两点A、B间距离

prev标记A上个位置,遍历B,如果当前数等于A就更新

用prev!=-1判断A是否出现过来决定是否更新

例题:

A.每日一题——1437. 是否所有 1 都至少相隔 k 个元素

B.双指针——2511. 最多可以摧毁的敌人城堡数目

B.双指针——821. 字符的最短距离

A.每日一题——868. 二进制间距

异向双指针

本质:利用位置性

①对撞双指针

首尾双指针往里缩,逐步判断,同向双指针的缩影,本质就是利用位置性

例题:

优选算法-双指针:4.盛水最多的容器(重点题)

优选算法-双指针:5.有效三角形的个数(重点题)

优选算法-双指针:6.和为s的两个数字(重点题)

优选算法-双指针:7.三数之和(重点题)

优选算法-双指针:8.四数之和(重点题)

B.双指针——125.验证回文串

B.双指针——905. 按奇偶排序数组

B.双指针——2441. 与对应负数同时存在的最大正整数

B.双指针——2465. 不同的平均值数目

B.双指针——2824. 统计和小于目标的下标对数目

B.双指针——2562. 找出数组的串联值

B.双指针——3194. 最小元素和最大元素的最小平均值

A.每日一题——344. 反转字符串

②中心扩展双指针

找到一个符合题意得点,左右扩展,本质也是利用位置性

例题:

B.双指针——977. 有序数组的平方

👆归纳原因:找到正负数的节点,利用正数平方依旧升序,负数平方降序的特点解题

其他

题目及解析👇

A.每日一题——240. 搜索二维矩阵 II

D.二分查找-二分答案-第K小/第K大——378. 有序矩阵中第 K 小的元素

D.二分查找-二分答案-其他——74. 搜索二维矩阵

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐