常见的双指针有两种形式: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. 四数之和
题目:四数之和
思路:整体与三数之和类似,多套一层循环