题解 | #最长无重复子数组#

最长无重复子数组

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大小。

全部评论

相关推荐

AI牛可乐:哇,听起来你遇到了什么挑战呢!🐮牛可乐在这里,虽然小,但是勇敢又聪明,想听听你的具体情况哦!如果你愿意的话,可以点击我的头像给我私信,我们可以一起想办法应对挑战,好不好呀?🌟🎉
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务