import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        int left = 0;
        int max  =0;
        HashMap <Integer,Integer> map = new HashMap<>();
        for(int i=0; i<arr.length ; i++){
            if(map.containsKey(arr[i]))
                //left 代表当前子数组的开头
                left = Math.max(left,map.get(arr[i])+1);
            //2,3,2 开头原来为0 后来变成1
            //23, 32长度是一样的
            max = Math.max(max,i-left+1);
            map.put(arr[i],i);
        }
        return max;
    }
}

哈希 + 滑动窗口
left 更新的时候应该注意 left是当前left的下一位
123 i=0 left=2 长度应该是 left-i + 1

梅华东一次都更新一次;

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        if(arr.length<2) return arr.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        int left = 0; 
        int max = 0;
        for(int i=0;i<arr.length;i++){
            if(map.containsKey(arr[i])){
                left = Math.max(left,map.get(arr[i])+1);
            }
            max = Math.max(max, i-left+1);
            map.put(arr[i],i);
        }
        return max;
    }
}