双指针是一种非常实用的技巧,往下又可细分为快慢指针、左右指针和滑动窗口等
快慢指针
快慢指针一般用于解决链表问题,如141. 环形链表
快指针一次走两步,慢指针一次走一步,如果没有环,快指针则会多绕一圈后与慢指针相遇
1 | class Solution: |
1 | class Solution: |
其中逻辑如下:
a->(b,c)
a+b+c=2(a+b)
c=a+b
从头开始走a+b或c时相遇
快指针的速度是慢指针的两倍,快指针走到尾时,慢指针刚好处于中间结点
1 | class Solution: |
只要掌握了快慢指针,很快就能解决这类链表问题了
左右指针
1 | class Solution: |
1 | class Solution: |
滑动窗口
滑动窗口顾名思义,就是一个在不断滑动(一般是向右滑动)的窗口,窗口扩张右界时增大,收缩左界时减小,窗口在滑动过程中不会往左倒退(也就是说,左右边界的下标一直在增大,不会减小)
滑动窗口的核心在于
- 扩张右界(一般是为了找到可行解)
- 收缩左界(一般是为了去除部分解,找到局部最优可行解)
周赛刚好遇到一题:考试的最大困扰度
1 | class Solution: |