题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4?tpId=295&tqId=1008889&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
C语言
int maxLength(int* arr, int arrLen ) {
// write code here
int* hash = (int*)calloc(100001, sizeof(int));
memset(hash, 0, sizeof(int)*100001);
// int hash[9] = {0}; //本地测试使用
int left = 0, right = 1; //左右索引
int maxLen = 1; //最大长度,初始为1,即左索引
hash[arr[left]] = 1; //初始左索引已使用
while(right < arrLen){ //右索引循环至数组最后
if(hash[arr[right]] == 0){ //判断右索引的值是否未使用
hash[arr[right]] = 1; //修改为已使用
maxLen = (maxLen > (right - left + 1) ? maxLen : (right - left + 1)); //更新最大长度
}else{ //如果已使用,则需要左索引不断向右移动直到找到重复的值
while(arr[left] != arr[right]){ //如果左索引的值不为重复值,
hash[arr[left]] = 0; //将左索引当前值修改为未使用
left++; //左索引向右移动
}
left++; //左索引指向重复值的右边
}
right++; //右索引移动
}
free(hash);
return maxLen;
}