解题思路如下:
滑动窗口
使用map记录状态,key=数组元素,value=数组下标;
使用for循环右移窗口右边界,当map中包含这个key,说明此时子数组出现了重复元素,此时需要移动窗口左边界,即start,
移动start的规则为,start=重复元素上一次出现的位置+1,同时更新map中此元素的下标
注意:为了防止 start=重复元素上一次出现的位置+1 时出现左移,需要额外增加一个判断,即start =Math.max(start, window.get(key) + 1);
public int maxLength (int[] arr) {
// write code here
int start=0;
int len=0;
Map<Integer,Integer> window = new HashMap<>(arr.length);
for(int i=0;i<arr.length;i++){
int key = arr[i];
if(!window.containsKey(key)){
window.put(key,i);
len = Math.max(i-start+1,len);
}else{
//注意此处start的移动判断,要取二者较大的值,防止start往左回退
start =Math.max(start, window.get(key) + 1);
window.put(key,i);
len = Math.max(i-start+1,len);
}
}
return len;
}
京公网安备 11010502036488号