<aside> 💡 核心思想:优化两重循环的算法

所有的双指针算法都是O(n)

</aside>

双指针理论

  1. 左右指针:主要解决数组(或者字符串)中的问题,比如字符串逆置等
  2. 快慢指针:主要解决链表中的问题,比如典型的判定链表中是否包含环。原地修改数组的问题一般也可以用快慢指针来解决。
  3. 滑动窗口属于左右指针类型的算法

一、左右指针

左右指针在数组中实际是指两个索引值,一般初始化为 left = 0, right = nums.length - 1

二、滑动窗口

这个算法技巧的思路仍然是左右指针的思想,就是维护一个窗口,不断滑动,然后更新答案。

最长连续不重复子序列

https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/submissions/

思路:i指针从头遍历数组,j指针永远在i指针前面,j表示往左最远能到什么地方,即i到j区间都是无重复元素,如果i往前走一步,导致区间内有重复元素,则j往前移,直到没有重复元素。

注意:

  1. 由于i与j区间是从小到大的,如果i往前走一步,导致区间内有重复元素,可以说是新增的元素为重复元素,但是重复的地方不知道在区间哪个位置,因此用一个数组来记录元素出现的次数(类似哈希表),如果新增的元素导致次数大于1,则j往前走,直到该元素次数只有一次
  2. check(i,j)表示判断i到j是否有重复元素,如果有重复元素,则返回True

Untitled