这个题用动态规划比较好解决一点。需要找到不变的是啥?这个是难点。
1. 如果前一个位置结尾的最长无重复子数组长度是n,那当前最长n+1
2. 如果当前位置的数值之前存在过,当前位置结尾的最长的无重复子数组的长度需增加一个约束,当前位置减去上一个存在位置的长度。
3. 返回值是每次取max
4. 记录每个数值的前一个出现的位置,用hashmap最快
5.处理边界条件,默认每个数值的初始位置为-1,数组长度为0时,返回0,其余情况dp[0] 默认为1

class Solution {
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        if(arr.size() == 0){
            return 0;
        }
        
        vector<int> dp = {1};
        int n = arr.size();
        int res = dp[0];
        // write code here
        unordered_map<int, int> m;
        for(int i=0;i<10;i++){
            m[i] = -1;
        }
        m[arr[0]] = 0;
        
        for(int i=1;i<n;i++){
            int num = arr[i];
            dp.push_back(1);
            if(m[num] != -1){
                dp[i] = min(i-m[num],dp[i-1] + 1);
            }else{
                dp[i] = dp[i-1] + 1;
            }
            res = max(res,dp[i]);
//             printf("dp[%d] = %d\n",i,dp[i]);
            m[num] = i;
        }
        
        return res;
    }
};