下面是两种方法,第一种只用了双指针,没涉及到哈希表,这个题给我说明了双指针不只是头尾指针,也可以是一前一后甚至是同一个起点给我涨知识了,下面直接上代码了。
一、
int maxLength(vector<int>& arr) {
int k = 0;
int MAX = INT_MIN;
int j = 0;
for(int i=0;i<arr.size();i++){
for(j = k;j<i;j++){
if(arr[i]==arr[j]){
k = j+1;
break;
}
}
MAX = max(MAX,i-k+1);
}
return MAX;
}
二、两道题都是像蚯蚓一样一前一后地运动,一旦发现相同的就重新计算,同时记得保留之前的长度。
if(arr.empty())
return 0;
//init
map<int,int> map; // value-index
int left = 0;
int right = 1;
map[arr[0]] = 0;
int maxLength = 0; //记录最大连续不重复子序列长度
//假设 left--right 为连续不重复段
while(left<=right && right<arr.size()){ //[left,right]
//待加入元素 arr[right]重复,先删除再加入
if(map.count(arr[right])){
//从left删除至与arr[right]等值元素
while(arr[left]!=arr[right]){
map.erase(arr[left]);
++left;
}
++left;
}
//加入arr[right]
map[arr[right]] = right;
maxLength = max(maxLength,(int)map.size());//map中放的就是当前的最长无重复
++right;
}
return maxLength;
}