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