输入包含两行,第一行包含一个整数n,代表数组arr的长度,第二行包含n个整数,代表数组arr。
输出一个整数,代表arr的最长无重复字符的长度。
4 2 3 4 5
4
5 2 2 3 4 3
3
时间复杂度,额外空间复杂度。
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.HashSet; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] strArr = br.readLine().split(" "); int[] arr = new int[n]; for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]); int left = 0, right = 0; HashSet<Integer> used = new HashSet<>(); int maxLen = 0; while(right < n){ if(!used.contains(arr[right])){ used.add(arr[right]); // 一直不重复就一直扩张右边界 right++; }else{ // 重复了就更新长度,收缩左边界,直到把第一次出现的重复元素排除掉 maxLen = Math.max(maxLen, right - left); while(left < right && arr[left] != arr[right]){ used.remove(arr[left]); left++; } left++; right++; } } maxLen = Math.max(maxLen, right - left); System.out.println(maxLen); } }
import java.io.*; public class Main{ public static int maxUnique(int[] str){ if(str==null||str.equals("")){ return 0; } int[] map=new int[256999]; for(int i=0;i<256999;i++){ map[i]=-1; } int len=0; int pre=-1; int cur=0; for(int i=0;i<str.length;i++){ pre=Math.max(pre,map[str[i]]); cur=i-pre; len=Math.max(len,cur); map[str[i]]=i; } return len; } public static void main(String[] args) throws IOException{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int n=Integer.parseInt(br.readLine().trim()); int[] str = new int[n]; String[] ops = br.readLine().split(" "); for(int i = 0; i < n; i++){ str[i] = Integer.parseInt(ops[i]); } System.out.print(maxUnique(str)); } }