题解 | 最长无重复子数组
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
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; // 返回最长无重复子数组的长度 } };