class Solution 
{
    bool vis[100010] = {false}; // 标记数组,记录元素是否在当前窗口中出现过
public:
    int maxLength(vector<int>& arr) 
    {
        int left = 0, right = 0, len = 1; // 初始化左右指针和最大长度
        
        // 右指针遍历整个数组
        while(right < arr.size())
        {
            // 当右指针指向的元素已在窗口中出现,需要收缩左指针
            while(vis[arr[right]] && left <= right)
            {
                vis[arr[left]] = false; // 标记左指针指向的元素为未访问
                left++; // 左指针右移
            }

            // 更新最大长度,窗口长度为 right - left + 1
            len = max(len, right - left + 1);
            
            // 标记当前元素为已访问
            vis[arr[right]] = true; 

            // 右指针右移,扩展窗口
            right++;
        }
        
        return len; // 返回最大无重复子数组长度
    }
};