双指针的两种常见模型:
for (int i = 0, j = 0; i < n; i++)
{
while (j < i && chaeck(i, j)) j++;
//题目具体逻辑
//……
}
核心思想:将朴素的两层循环(O(n^2))优化到O(n)(暴力->观察i,j是否存在单调关系->双指针优化)
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
const int N = 1e6;
int a[N];
int s[N];
map<int,int>m;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin>>a[i];
}
int res = 0;
for (int i = 0,j=0; i < n; i++)
{
s[a[i]]++;
while (s[a[i]] > 1)//i,j所存区间内出现过a[i]
{
s[a[j]]--;
j++;
}
res = max(i - j + 1, res);
}
cout << res << endl;
return 0;
}