用双指针,第一个指针r总是指向最大无重复字串的结尾,第二个指针指向最大无重复指针的开头,并用集合set记录当前无重复字串的元素并求出这个无重复字串的长度

首先先让l和r两个指针都为0,先让arr[l]位置的值先进set集合中,默认开始时无重复字串就是arr[0],长度length=1

然后试探r+1这个位置的值是否存在集合中,如果不存在则直接将r+1这个位置的值添加到set集合中,

如果r+1这个位置的值存在set集合中,那么先将arr[l]位置的值从set集合中移除(因为这里不确定是哪个集合中的值和arr[r+1]中的值重复了,所以要一个一个试探),再将l指针向前移动,一直重复这个步骤.直到arr[r+1]的值和set集合中的值无重复,此时将arr[r+1]中的值添加到set中,此时可以保证set中没有重复的值,并且当前set中的元
素个数就是当前最大的无重复字符串的长度.每次将arr[r+1]的值添加到set后更新length的值

最后返回length就可以

代码:
public int maxLength (int[] arr) {
if (arr.length == 1) {
return 1;
}
int l = 0, r = 0;
int length = 0;
HashSet<integer> set = new HashSet<>();
set.add(arr[l]);
for (; r < arr.length - 1; ) {
while (set.contains(arr[r + 1])) {
set.remove(arr[l]);
l++;
}
r++;
set.add(arr[r]);
length = set.size()>length?set.size():length;
}
return length;
}</integer>