遗忘的双指针算法------最长***序列
作者:
cyuyu
,
2022-04-03 15:13:40
,
所有人可见
,
阅读 140
题目1:
799. 最长连续不重复子序列
代码:
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int s[N];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int j=0;
int res=0;
for(int i=0;i<n;i++){
s[a[i]]++;
while(j<n&&s[a[i]]>1){
s[a[j]]--;
j++;
}
res=max(res,i-j+1);
}
cout<<res<<endl;
return 0;
}
题目2:
4394. 最长连续子序列
代码:
#include<iostream>
using namespace std;
const int N=1e6+5;
int a[N];
int s[N];
int main(){
int n;
int k;
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
int j=0;
int res=0;
int p=0;
int l=1;
int r=1;
for(int i=0;i<n;i++){
s[a[i]]++;
if(s[a[i]]==1)
p++;
while(j<n&&p>k){
s[a[j]]--;
if(s[a[j]]==0){
p--;
}
j++;
}
res=max(res,i-j+1);
if(res==i-j+1){
l=j+1;
r=i+1;
}
}
cout<<l<<' '<<r<<endl;
return 0;
}