题解:AcWing 799 最长连续不重复子序列

【题目来源】

AcWing:799. 最长连续不重复子序列 - AcWing题库

【题目描述】

给定一个长度为 \(n\) 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

【输入】

第一行包含整数 \(n\)

第二行包含 \(n\) 个整数(均在 \(0\sim 10^5\) 范围内),表示整数序列。

【输出】

共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

【输入样例】

5
1 2 2 3 5

【输出样例】

3

【解题思路】

image

image

【算法标签】

《AcWing 799 最长连续不重复子序列》 #双指针#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;  // 定义数组最大长度

int n;                // 数组长度
int a[N];             // 存储原始数组
int s[N];             // 哈希表,记录每个数字出现的次数

int main()
{
    // 输入数组长度
    cin >> n;
    
    // 输入数组元素
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    int res = 0;  // 记录最长无重复子数组长度
    
    // 双指针算法:i是右指针,j是左指针
    for (int i = 0, j = 0; i < n; i++)
    {
        s[a[i]]++;  // 记录当前数字出现次数
        
        // 如果当前数字出现次数超过1次,移动左指针j
        while (s[a[i]] > 1)
        {
            s[a[j]]--;  // 减少左指针指向数字的计数
            j++;        // 左指针右移
        }
        
        // 更新最大长度
        res = max(res, i - j + 1);
    }
    
    // 输出最长无重复子数组长度
    cout << res << endl;
    
    return 0;
}

【运行结果】

5
1 2 2 3 5
3
posted @ 2026-02-20 22:49  团爸讲算法  阅读(2)  评论(0)    收藏  举报