题解 | 最长无重复子数组

最长无重复子数组

https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

class Solution 
{
public:
    int maxLength(vector<int>& arr) 
    {
        unordered_map<int, int> hash;
        int max_len = 1;
        for(int left = 0, right = 0; right < arr.size(); right++)
        {
            if(hash.count(arr[right]) && hash[arr[right]] >= left)
                left = hash[arr[right]] + 1;
            hash[arr[right]] = right;
            max_len = max(max_len, right - left + 1);
        }
        return max_len;
    }
};
#include <vector>
#include <unordered_set>
using namespace std;

class Solution 
{
public:
    int maxLength(vector<int>& arr) 
    {
        int n = arr.size();  // 获取数组长度
        if(n == 1) return 1;  // 边界条件:数组只有1个元素时,最长无重复子数组长度为1

        int max_len = 1;  // 记录最长无重复子数组的长度,初始化为1(至少有1个元素)
        int left = 0, right = 0;  // 滑动窗口的左右指针,初始都指向0(窗口起始位置)
        unordered_set<int> hash;  // 哈希集合,用于记录当前窗口内的元素(快速判断重复)

        // 右指针遍历整个数组,扩展窗口右边界
        while(right < n)
        {
            // 情况1:当前元素不在哈希集合中(窗口内无重复)
            if(!hash.count(arr[right])) 
            {
                hash.insert(arr[right]);  // 将元素加入集合,标记为已在窗口内
                // 更新最长长度:当前窗口长度(right - left + 1)与历史最大值比较
                max_len = max(max_len, right - left + 1);
                right++;  // 右指针右移,扩展窗口
            }
            // 情况2:当前元素在哈希集合中(窗口内有重复)
            else
            {
                hash.erase(arr[left]);  // 移除左指针指向的元素(缩小窗口左边界)
                left++;  // 左指针右移,缩小窗口,直到窗口内无重复元素
            }
        }
        return max_len;  // 返回最长无重复子数组的长度
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-24 13:39
在记录秋招的大魔王很...:别被忽悠了,我做了多年销售。我可以告诉你,这就是忽悠你的,销售一定要看底薪也要看提成两者不可缺一。提成是有业绩的时候才拿的到的,谁能保证一直有单状态都好。销售有时候很讲究运气的。底薪是你这个人这个岗位日常工作体现的价值。别小看底薪,你看那些跳槽去做经理主管的,底薪底一些,人家愿意去吗?所以那些说销售靠提成的纯属忽悠,除非他们的业务很容易成单。
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
Gaynes:查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务