算法(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. 四数之和

题目:四数之和

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

相关推荐
Doubbbbbbble云1 小时前
内存碎片化对数据结构操作性能的影响研究4
数据结构
xiangyun613 小时前
【408数据结构 03】线性表与顺序表:C++手写SeqList
开发语言·数据结构·c++
爱吃苹果的日记本4 小时前
数据结构第三课补充(空间复杂度)
数据结构·学习
多弗朗皮卡丘4 小时前
数据结构6:队列
c语言·数据结构
xxxiugou1234 小时前
双指针解题秘籍:从入门到精通
c语言·数据结构·c++·算法
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出地铁规划中的“独特坐标“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
沉淀的.晴天5 小时前
FreeRTOS信号量
数据结构·算法
青山木5 小时前
Hot 100 --- 打家劫舍
java·数据结构·算法·leetcode·动态规划
YSL0701246 小时前
线性表和顺序表
数据结构