题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。
数据范围
1≤n≤100000
输入样例:
5
1 2 2 3 5
输出样例:
3
具体代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int[] s=new int[100010];
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=scanner.nextInt();
}
int res=doublePoint(arr,s,n);
System.out.print(res);
}
private static int doublePoint(int[] arr,int[] s,int n) {
int res=0;
for(int i=0,j=0;i<n;i++){
s[arr[i]]++;
while(j < i && s[arr[i]]>1){
s[arr[j]]--;
j++;
}
res=Math.max(res,i-j+1);
}
return res;
}
}
思路分析
数组arr[]={ 1 , 2 , 2 , 3 , 5 }
用两个指针 [ i , j ] 之间的距离来表示不重复的序列长度
定义 数组s[] 存放arr[]
移动 i ,将arr[i] 存放到s[]中,循环判断 s[arr[j]] 所指的数据 是否在里面。如果在则向右移动指针j
具体代码分析
循环结束,返回res
谢谢大佬,但是 while(j < i && s[arr[i]]>1){ 中的 j < i是不是没有必要啊,只需要后面的判定条件就可以了。
这个 while(j < i && s[arr[i]]>1),就j[HTML_REMOVED]1就限定了条件