题解 | #最长无重复子数组#
最长无重复子数组
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大小。