
一、双指针
双指针、尺取法、滑动窗口,名字不一样,核心是一件事:两个指针都往前走,尽量不回头。暴力枚举里只要能看出'右边继续扫没有新信息,左边挪一步也不用推倒重来',就值得往这个方向改。
我更愿意把它理解成一种'把重复动作省掉'的写法,而不是一套死模板。真到做题时,先想窗口里要维护什么,再想怎么移动指针,通常比上来背套路稳得多。
二、双指针经典算法题
2.1 唯一的雪花
2.1.1 题目
链接:唯一的雪花

2.1.2 算法原理
这题是最长不重复子数组,标准滑动窗口。
思路不复杂:
right向右扩,记录窗口内每个数出现的次数;- 一旦新加入的数重复了,窗口就不合法;
- 这时让
left往右缩,直到重复消掉; - 每次窗口重新合法后,顺手更新最长长度。
这里最关键的一点,是 right 不用回退。因为当前窗口的信息已经够了,回头重扫只会多做一遍重复工作。
哈希表可以用 unordered_map,如果数值范围固定,也可以直接用数组模拟。
2.1.3 代码
#include<iostream>
#include<unordered_map>
using namespace std;
const int N = 1e6+10;
int a[N];
int main(){
int t; cin >> t;
while(t--){
int n; cin >> n;
for(int i = ; i <= n; i++) cin >> a[i];
l = , r = ;
unordered_map<,> mp;
ret = ;
(r <= n){
mp[a[r]]++;
(mp[a[r]] > )
mp[a[l++]]--;
ret = (ret, r - l + );
r++;
}
cout << ret << endl;
}
;
}






