题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
#include <unordered_map>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
// write code here
int n = arr.size();
if (n < 2) {
return n;
}
unordered_map<int, int> numCount;
int i = 0, j = 0;
int maxlen = 0;
while (i <= j && j < n) {
++numCount[arr[j]]; //统计各个字符数量
if (numCount[arr[j]] > 1) { //如果大于1,就是出现两次,出现两次说明前面有重复了。
while (arr[i] != arr[j]) {
--numCount[arr[i]];
++i; //移动i
}
--numCount[arr[j]]; //修改计数
++i, ++j;
} else {
++j;
if (j - i > maxlen) {
maxlen = j - i;
}
}
}
return maxlen;
}
};
双指针,i指向子数组头,j指向子数组尾。初始化i,j。先走j,遍历计数,maxlen = j - i。当出现重复元素时,右移i,定位到新的无重复子数组的开始位置。比较maxlen大小。
