条件:
- 设置两个指针/索引,
left = 0right = 1; map<int,int>,记录数组元素的 值-索引:value:index
设定:
left到right之间的元素为连续不重复;map中存放left到right间元素的 值-索引 对;- 初始
left right都在数组首部,从right++进数,从left--出数; - 进数:
right++,检查map(含连续不重复子序列中所有元素) 中是否存在arr[right],不存在即不重复,向连续不重复子序列进数,加入map,right继续向前。 - 出数:
left--,以上检查map是否含arr[right]时,若存在,则需要从left段出数,即从map中吐出arr[left],并left++,直至arr[left]==arr[right],即一直吐到存在的和当前right所指同值元素。 - 在每次进数出数的过程中,维护不重复子数组的最大长度
maxLength = max{maxLength, map.size()}
整个过程,像蚯蚓一样伸缩爬动至数组末尾,
right为头 一直向前吞,left为尾 一直前缩吐数。
/*
【双指针】
从右指针进数,从左指针出数
*/
int maxLength(vector<int>& arr) {
// write code here
//invalid input
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 = maxLength<map.size()? map.size():maxLength;
++right;
}
return maxLength;
}
京公网安备 11010502036488号