class Solution 
{
public:
    int maxLength(vector<int>& arr) 
    {
        unordered_map<int, int> hash;
        int max_len = 1;
        for(int left = 0, right = 0; right < arr.size(); right++)
        {
            if(hash.count(arr[right]) && hash[arr[right]] >= left)
                left = hash[arr[right]] + 1;
            hash[arr[right]] = right;
            max_len = max(max_len, right - left + 1);
        }
        return max_len;
    }
};
#include <vector>
#include <unordered_set>
using namespace std;

class Solution 
{
public:
    int maxLength(vector<int>& arr) 
    {
        int n = arr.size();  // 获取数组长度
        if(n == 1) return 1;  // 边界条件:数组只有1个元素时,最长无重复子数组长度为1

        int max_len = 1;  // 记录最长无重复子数组的长度,初始化为1(至少有1个元素)
        int left = 0, right = 0;  // 滑动窗口的左右指针,初始都指向0(窗口起始位置)
        unordered_set<int> hash;  // 哈希集合,用于记录当前窗口内的元素(快速判断重复)

        // 右指针遍历整个数组,扩展窗口右边界
        while(right < n)
        {
            // 情况1:当前元素不在哈希集合中(窗口内无重复)
            if(!hash.count(arr[right])) 
            {
                hash.insert(arr[right]);  // 将元素加入集合,标记为已在窗口内
                // 更新最长长度:当前窗口长度(right - left + 1)与历史最大值比较
                max_len = max(max_len, right - left + 1);
                right++;  // 右指针右移,扩展窗口
            }
            // 情况2:当前元素在哈希集合中(窗口内有重复)
            else
            {
                hash.erase(arr[left]);  // 移除左指针指向的元素(缩小窗口左边界)
                left++;  // 左指针右移,缩小窗口,直到窗口内无重复元素
            }
        }
        return max_len;  // 返回最长无重复子数组的长度
    }
};