AcWing 799. 《算法基础课》双指针模板题1--最长连续不重复子序列
原题链接
简单
作者:
藕丝泥霸
,
2023-12-01 16:32:22
,
所有人可见
,
阅读 51
思路
维护[j,i]区间
当区间内有重复元素时,可以证明重复的元素一定是a[i]
此时移动j使得区间无重复元素,可以证明移动后的j一定在值为a[i]的下一个位置(单调性)
c++
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int n;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
int res=0;
for(int i=0,j=0;i<n;i++){
b[a[i]]+=1;
while(b[a[i]]>1){
b[a[j]]-=1;
j++;
}
res=max(res,i-j+1);
}
printf("%d\n",res);
return 0;
}
java
import java.util.*;
import java.io.*;
public class Main{
static int N=100010;
public static void main(String[] args) throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
int n=Integer.parseInt(br.readLine());
int[] arr=new int[n];
int[] cnt=new int[N];
String[] str=br.readLine().split(" ");
int res=0;
for(int i=0;i<n;i++) arr[i]=Integer.parseInt(str[i]);
for(int i=0,j=0;i<n;i++){
cnt[arr[i]]++;
while(cnt[arr[i]]>1) --cnt[arr[j++]];
res=Math.max(res,i-j+1);
}
pw.println(res);
pw.flush();
}
}