算法(1)——双指针

常见的双指针有两种形式:1. 对撞指针 2. 快慢指针

对撞指针: 两个指针从两端向中间移动,一般用于顺序结构,也称左右指针。终止条件:两个指针相遇或者错开

快慢指针:使用两个速度不同的指针在序列结构上移动,又称龟兔赛跑算法,有效用于处理数组、环形链表或出现循环往复的情况。常用的实现方式:慢的指针移动一位,快的指针移动两位

1. 移动零

题目:移动零

思路:用一个cur指针扫描整个数组,另一个dest指针记录非0数序列的最后一个位置,保证使 0, dest 的元素全部为非0元素 dest + 1, cur - 1的元素全为0

2. 复写零

题目:复写零

思路:如果从前往后复写,用于0写两次,会导致需要被复写的数被覆盖,所以选择从前往后复写,先找到最后一个复写的数,标记当前位置,然后从数组最后开始复写

3. 快乐数

题目:快乐数

思路:定义一个函数func来计算一个数每个位置上的数字的平方和,此题涉及到循环,使用快慢指针,定义慢指针为n,每次func一次,快指针为func(n),每次func两次,直至二者相等,最后判断是否为1

4. 盛水最多的容器

题目:盛⽔最多的容器

思路:使用对撞指针,已知指针对撞容器的宽度一定缩小,且容器的高度由较低侧高度决定,因此每次移动较低侧指针并更新最大容量,直至两个指针相遇

5. 有效三角形的个数

题目:有效三角形的个数

思路:先排序,三个数先固定最大数,使用对撞指针left和right,若相加大于最大数,则说明right与left,right-1所有的数都能组成三角形,个数+(right-left)个,right--;若相加小于最大数,则说明left与left+1,right所有的数都不能组成三角形,left++

6. 和为s的两个数

题目:i和为s的两个s数

思路:使用对撞指针left和right,若相加大于s,right--;若相加小于s,letf++

7. 三数之和

题目:三数之和

思路:先排序,固定最大数,下标为i,设最大数的相反数为目标数,使用对撞指针left和right,若相加大于目标数,right--;若相加小于目标数,letf++;若等于则为正确。去重操作:当找到正确数时,进行去重,若left+1 = left,则left++;若right-1 = right,则right--;若i-1 = i,则i--。小优化:当最大数小于0时,不存在正确答案,直接进行下一层循环

8. 四数之和

题目:四数之和

思路:整体与三数之和类似,多套一层循环

相关推荐
xxxiugou1239 小时前
链表算法题精讲:从两数相加到K组翻转
数据结构·c++·算法·链表
悠仁さん13 小时前
【算法C++】双指针(一)
数据结构·c++·算法
YukiRinLL13 小时前
字符串存储与 BF、KMP 匹配算法
数据结构·算法
INGNIGHT15 小时前
151 · 买卖股票的最佳时机 III(序列dp)
数据结构·算法·leetcode
Tisfy17 小时前
LeetCode 3644.排序排列:不对则与(脑筋急转弯)
数据结构·算法·leetcode·题解·位运算
H.莓飛18 小时前
【数据结构】快速排序专题
linux·服务器·c语言·数据结构·visual studio
重生之小比特19 小时前
【算法拾光】二分查找|在排序数组中查找元素的第一个和最后一个位置 + 搜索旋转排序数组
数据结构·算法·排序算法
YukiRinLL19 小时前
查找与排序算法:复杂度、稳定性
数据结构·算法·排序算法
careathers1 天前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
y1su1 天前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划