描述
给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
示例
输入:
[2,3,4,5]
返回值:
4
说明:
[2,3,4,5]是最长子数组
解题思路:
需要每次遍历的时候,对连续的数组元素长度累计,如果超过了最大值,更新这个最大值
如果遇到了重复的元素,需要将重复元素以及重复元素之前的元素全部移除,再将新的重复元素添加进结果集,在这个过程中继续判断长度是否超过限制
最后输出这个最大值,即为无重复子数组的最大值
根据描述我们可以知道需要一个结构能够灵活地移除重复元素以及重复元素之前的元素,hashmap结构可以去重;Queue双端队列也可以从队头移除元素;
但是这里,我们使用set来完成这个,注意在移除元素的时候要注意进行循环移除,因此第二个while语句的作用如下:
public int maxLength (int[] arr) {
// write code here
Set<Integer> set = new HashSet<>();
int max = 0;
if (arr == null || arr.length ==0){
return max;
}
int left =0;
int right =0;
while(right < arr.length) {
while (set.contains(arr[right])) {
set.remove(arr[left]);
left++;
}
set.add(arr[right++]);
if(set.size() > max){
max = set.size();
}
}
return max;
}
虽然移除set的队头不一定是移除重复的那个,但是只要set集合包含这个元素,就执行循环的移除,移除成功之后注意将新的元素加入,并且更新下标