算法积累笔记

一、双指针

虽然被叫做指针,但是是用数组的下标来锚定位置,其作用相当于"指针"。目前我所刷的题目中,大多是解决因暴力循环导致的超时问题,有了双指针就可以减少循环的次数。

划分区间

在数组中,解决数组数据分组的问题,例如在 移动零中,要将0和其他数据在数组中划分左右,且不改变原来数组中的数据的相对位置。这里不仅可以是把为零的移动,换个条件,比如将小于零的数往后移动,同样的原理,这里要注意的是,定义的两个指针(cur=0,dest= -1)的起始位置不同。因为当该数字不为零时,这两个指针要同时后移一位,若dest=0则会默认第一个数字归为非零数字,因为dest的位置及以前的数字都是处理过的非零数。

快慢指针

即一个走得慢的指针,一个走的快的指针,按照一定规律来完成一些任务。
目前了解到的使用场景有:

a. 判断是否有环(数组、链表)

链表:

利用快慢指针,即按照慢指针一次走一步,快指针一次走两步或n步的规律来遍历,如果出现了环,这两个指针一定会在某一处相遇。
数组: 数组的环与链表有所不同,因为数组没有next去指向下一个数据, 但如果是"数组模拟链表",numsi的下一个是numsnums\[i],则没问题。可以参考 快乐数 这一题,指针本身就是数组的数据。

b. 找到链表的某个位置(中间位置或删除指定位置的节点)

在一个链表中,我要得到倒数第三个位置的数据,我可以让快指针先走两步,然后快慢指针一起走,当快指针走到头的时候,慢指针所指的位置就是倒数第三个数据的位置。可以参考 删除链表的倒数第 N 个结点

c. 找到链表成环的入口


在一个有环链表中,a为链表首部到环入口的距离,b为链表入口到两指针相遇位置的距离,c为环的剩余长度 ,通过等式 fast走的长度是slow走的长度的2倍, 可以得出 a=c(k=1时)。 也就是说,从头结点走到入口的距离a,等于从相遇点出发环绕(k-1)圈后再走c距离到达入口。那么我让相遇的其中一个指针回到头节点,然后这两个指针再同步移动,再次相遇的节点就是入口。可以参考 环形链表 II

d. 有序数组的去重 (参考: 删除有序数组中的重复项)

让fast指针去遍历,每当所遍历的数与slow当前所指的数不同,那么就可以让slow后移,然后进行赋值,这样不仅只需遍历一次数组,还可以在原数组修改,不需要利用额外的空间。

相向指针

这样运动的指针,通常用来缩小符合条件的区间,即找到了符合条件的边界,两个指针区间里面的都是符合条件的,那么就没必要再继续进行了。
可以参考如下的题目:
a. 三数之和
b. 四数之和
c. 盛最多水的容器
d. 有效三角形个数
做这些题目的时候,要注意是否要对原数组进行排序,通常情况下是配合这些数据的单调性以及题目本身的特性来解决。同时也要注意题目要的是累计结果,还是最值,如果是最值,要记得及时更新结果。

相关推荐
学渣超8 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
掉鱼的猫8 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·llm·aigc
Tairitsu_H8 小时前
[LC优选算法#17] 链表 | 合并 K 个升序链表 | K个⼀组翻转链表
数据结构·算法·链表
_olone8 小时前
Luogu P2704 [NOI2001] 炮兵阵地
c++·算法·状压dp
带刺的坐椅9 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·ai·llm·agent·solon-ai
c238569 小时前
互斥锁高频面试题全解:从基础概念到底层实现,一文通关
java·c++·面试·职场和发展
kebidaixu9 小时前
两轮BMS 防打火策略详解
算法
error:(9 小时前
【系统与实战双精通】VS Code 调试 ROS2 Python 节点与 Launch 系统指南
android·java·python
wabs66610 小时前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
退休倒计时10 小时前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript