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

题目:四数之和

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

相关推荐
7yewh15 分钟前
SLAM 三维空间刚体运动(2)
数据结构·人工智能·机器人·嵌入式·slam
leikooo1 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
lvwangshu4 小时前
登录日志 题解
数据结构·线段树·题解·技巧·性质题·思维好题·细节题
CQU_JIAKE4 小时前
10.2【A】
数据结构
C++ 老炮儿的技术栈5 小时前
不一样的数值交换
数据结构·c++·人工智能·算法·c·csdn开发云
青山木6 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划
梦帮科技7 小时前
vLLM / TensorRT-LLM 极限推理:PagedAttention 细粒度物理页表管理与连续批处理(Continuous Batching)实战
数据结构·人工智能·分布式·python·深度学习·算法·vllm
H.莓飛9 小时前
【数据结构】链表_OJ题
linux·数据结构·算法·链表
All for pursuit.9 小时前
【回溯-4】46.全排列
数据结构·c++·算法·leetcode
7yewh12 小时前
SLAM 从视觉里程计到建图(6)
数据结构·人工智能·机器人·自动驾驶·嵌入式