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

最长无重复子数组

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

全部评论

相关推荐

点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务