[LeetCode训练营]双指针

双指针模型

当遇到有序数组时,应该优先想到双指针来解决问题,因为两个指针的同时遍历会减少空间复杂度和时间复杂度。
如果给定数组没有排序,可以考虑排序后找规律以此提高算法的时间复杂度和空间复杂度。

对撞指针

对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。常用于有序数组或指针。

同速指针

链表上两个指针,一个先出发,另一个后出发并以相同的速度跟随。

  • 求链表的逆:通过临时指针让双指针同步前行。
  • 求链表倒数第 k 个元素:先让其中一个指针向前走k步,接着两个指针以同样的速度一起向前进,直到前面的指针走到尽头了,则后面的指针即为倒数第k个元素。

快慢指针

快慢指针是两个指针从同一侧开始遍历数组,将两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。

  • 计算链表的中点:快慢指针从头节点出发,每轮迭代中,快指针向前移动两个节点,慢指针向前移动一个节点,最终当快指针到达终点的时候,慢指针刚好在中间的节点。
  • 判断链表是否有环:快慢节点从头节点出发,如果链表中有环,两个指针最终会在环中相遇。
  • 求链表中环的长度:只要相遇后一个不动,另一个前进直到相遇算一下走了多少步就可以得出链表中环的长度。

本文章主要内容摘自阿里云天池leetcode训练营,主要当作笔记记录,如有错误的地方或者有没写完的地方,请见谅。

猜你喜欢

转载自blog.csdn.net/qq_45415920/article/details/123171374