class Solution {
  public:
    int maxLength(vector<int>& arr) {
        if (arr.empty()) return 0;

        unordered_map<int, int> lastPos; // 记录每个数字最近出现的位置
        int left = 0, maxLen = 0;

        for (int right = 0; right < arr.size(); right++) {
            // 如果当前数字(键)已经在窗口中存在,并且出现位置在left右侧
            if (lastPos.find(arr[right]) != lastPos.end() && lastPos[arr[right]] >= left) {
                left = lastPos[arr[right]] + 1; // 移动左指针
            }

            // 更新当前数字的位置,字典中的键是唯一的,出现重复数字时,需更新该键
            lastPos[arr[right]] = right;

            // 更新最大长度
            maxLen = max(maxLen, right - left + 1);
        }

        return maxLen;
    }
};