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; // 返回最长无重复子数组的长度
}
};