为啥要用双指针?
先试想一下,如果用BF来解题
for(i = 0;i < len; i++)
for(j = 0;j <= i; j++)
if(check(——))
时间复杂度为O(n^2),没有进行优化,如果数列为单调,(sort后必然单调)可以使用双指针优化,所以核心思想:
将BF算法O(n^2)=>双指针O(n)
在我理解,只要是这种的优化都可以称之为双指针算法
模板实现
for(i = 0,j = 0;i < n;i++)
{
while(j < i && check(i,j))
j++;
//根据题目来看
}
题目:最长不连续子序列
BF算法:
for(int i = 0;i < n; i++)
for(int j = 0; j <= i; j++)
if(check(j,i))
{
res = max(res,j - i + 1);//更新最大的,即为最长
}
双指针算法:
for(int i=0,j=0;i<n;i++)
{
while(j<=i&&check(j,i)) j++;
res=max(res,j-i+1);
}
先写bf算法,然后通过i,j之间的单调关系来优化,从而写出双指针算法
#include<iostream>
using namespace std;
const int N = 100010;
int n;
int a[N],s[N];
int main()
{
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)
{
s[a[j]]--;
j++;
}
res = max(res,i-j+1);
}
cout<<res;
return 0;
}