学习笔记 | 双指针、滑动窗口、快慢指针

01 双指针,two pointers

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向或者相反方向的指针进行扫描,从而达到相应的目的。移动两个指针包夹求解。

  • 时间复杂度一般为O(n)。
  • 分为:同向双指针异向双指针
识别使用双指针的招数:
  • 一般来说,数组或是链表是排好序的,你需要找一些组合满足某种限制条件。比如,你需要去比较数组中每个元素和其他元素的关系时,你就需要用到双指针了。
  • 这种组合可能是一对数,三个数,或是一个子数组。
掌握:
  • 递增整数序列中,哪两个元素之和等于target
学习笔记 | 双指针、滑动窗口、快慢指针_第1张图片
  1. 使用下标i,j对序列进行扫描(可以同向扫描,也可以反向扫描)
  2. 利用序列递增的性质,以浅显的思想降低了时间复杂度
  • 序列合并问题
  • 2路归并排序
  • 快速排序/随机快排

02 滑动窗口

  • 滑动窗口是数组/字符串/链表问题(输入是一些线性结构)中常用的抽象概念。
  • 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i, j)(左闭,右开)。
  • 滑动窗口是可以将两个边界向某一方向“滑动”的窗口。
学习笔记 | 双指针、滑动窗口、快慢指针_第2张图片

例如,我们将 [i, j)向右滑动 1个元素,则它将变为 [i+1, j+1)(左闭,右开)。

再比如找最长的全为1的子数组长度。滑动窗口一般从第一个元素开始,一直往右边一个一个元素挪动。当然了,根据题目要求,我们可能有固定窗口大小的情况,也有窗口的大小变化的情况。

  1. 是否找到了窗口,
  2. 窗口时否满足要求
  3. 窗口缩减等
应用:
  • 求最长/最短子字符串或是某些特定的长度要求

03 滑动窗口+双指针

解决重复解

移动指针时可能出现重复数字的情况。所以我们要确保移动指针后,对应的数字要发生改变才行哦。

04 快慢指针

  • 这种算法的两个指针的在数组上(或是链表上,序列上)的移动速度不一样。
  • 通过控制指针不同的移动速度(比如在环形链表上),这种算法证明了他们肯定会相遇的。快的一个指针肯定会追上慢的一个。
学习笔记 | 双指针、滑动窗口、快慢指针_第3张图片
什么时候需要用快慢指针模式?
  • 解决有环的链表和数组时特别有用。
  • 当你需要知道链表的长度或是某个特别位置的信息的时候。
啥时候用快慢指针而不是上面的双指针呢?
  • 有些情形下不应该用双指针,比如我们在单链表上不能往回移动的时候。
  • 一个典型的需要用到快慢指针的模式的是当你需要去判断一个链表是否是回文的时候。

你可能感兴趣的:(#,数据结构,刷题,面试,#,C++语言)