模板题,典型滑动窗口
class Solution {
public:
/**
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
// write code here
int n = arr.size();
// 窗口左右边界
int l = 0;
int r = 0;
// 缓存集合,判断重复
unordered_set<int> cache;
// 收缩标志位
bool flag;
// 初始最优解
int len = 0;
while( r < n){
// 扩展
int cur_r = arr[r++];
// 如果当前元素在集合中已经出现过,说明该元素之前的子序列已是局部最优解,该收缩了
if(cache.count(cur_r))
flag = true;
else
cache.insert(cur_r);
// 收缩
while(flag){
// 如果出现更优解则更新len(注意当前元素的位置为r-1
if(len < r - 1 - l)
len = r - 1 - l;
int cur_l = arr[l++];
cache.erase(cur_l);
// 重复元素已被删除,将目标元素插入集合
if(!cache.count(cur_r)){
flag = false;
cache.insert(cur_l);
}
}
}
return len == 0 ? n : len;
}
};