- 建立一个左开看,右闭得滑动窗口。
- 注意if 未必要和else链接,有的时候满足一个条件,窗口大小会突变。
- 应用map做这个题是最好的选择。
- 注意刚开始的返回条件,对于不同的题是不一致的。比如这个直接返回size()
class Solution {
public:
/**
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
// write code here
if(arr.size()<=1){
return arr.size();
}
//开始通过双指针的方式简历滑动窗口
int left = -1;
map<int,int> window;
window[arr[0]]=0; //先放入第一个元素
int max_window_length = 0;
for(int i = 1; i< arr.size();i++){
if(window.find(arr[i])!=window.end()){
left = max(left,window[arr[i]]);//移动左端点。立马不要前面的端点内容,直接让left
//移动到那个重复的点,且不包括
}
//注意只是前面是条件罢了,后面照样进行,如果进了前面的窗口大小回立马缩小。
max_window_length = max(max_window_length,i-left);
window[arr[i]] = i;
}
return max_window_length;
}
};