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

题目:四数之和

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

相关推荐
Pniubi9 小时前
关于算法用现成数据结构和手撕
数据结构
老师我太想进步了202619 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂20 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
꧁细听勿语情꧂21 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫21 小时前
【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱
数据结构·算法·leetcode
饮水桶_T2 天前
JAVA IO流笔记
开发语言·数据结构·算法
wo_jack2 天前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
zaizai10072 天前
算法(左程云)1
数据结构
charliejohn2 天前
计算机考研 408 数据结构 图论-关键路径
数据结构·图论