牛客高频题--最长无重复子数组
NC41 最长无重复子数组
1 class Solution { 2 public: 3 /** 4 * 5 * @param arr int整型vector the array 6 * @return int整型 7 */ 8 int maxLength(vector<int>& arr) { 9 // write code here 10 // 从前到后遍历,双指针front,idx指向无重复数组的前后端; 11 // 用一个变量记录当前的最大数组长度,如果后续出现重复值,就从重复处cidx截断,继续向后遍历。 12 if(arr.empty()){return 0;} 13 int front=0,idx=1; 14 map<int,int> cs;cs.insert(make_pair(arr[0], 0)); 15 int maxlen=1; 16 int curlen=1;; 17 while(idx<arr.size()){ 18 int cidx; 19 if(cs.count(arr[idx])>0){ 20 cidx=cs[arr[idx]]; 21 maxlen=maxlen>curlen?maxlen:curlen; // 先保留最大值 22 // 将重复元素前的清空 23 for(int i=front;i<=cidx;i++){ 24 cs.erase(arr[i]); 25 curlen-=1; 26 } 27 front=cidx+1; 28 } 29 cs.insert(make_pair(arr[idx],idx)); 30 curlen++; 31 ++idx; 32 } 33 return max(curlen,maxlen); 34 } 35 };
心之所愿,永不相忘