解题思路如下:
滑动窗口
使用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; }