双指针算法
了解:
双指针算法分为两种,
第一种是两个指针分别指向两个序列
第二类是两个指针指向同一个序列
思路:
模板如下:
for(int i=0,j=0;i<n;i++) { while(j<i||check(i,j)) j++; //每道题的具体逻辑 }一般需要双指针算法时,先考虑暴力做法,然后观察i和j的关系
代码模板:
#include<iostream> using namespace std; const int N=10010; int n; //n个数 int a[N],s[N]; //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]]++; //序列加长一,把新加入的元素,个数+1 while(s[a[i]]>1) //当新加入的元素使当前序列中有重复元素,循环直到没有重复元素 { s[a[j]]--; //将这个序列的开头元素个数-1 j++; //将j指针后移一位 } res=max(res,i-j+1); //取最长序列 } cout<<res<<endl; return 0; }