acwing-799. 最长连续不重复子序列

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

输入格式

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

输出格式

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

数据范围

1≤n≤10^5

输入样例:

5
1 2 2 3 5

输出样例:

3

方法一:

思路:

  1. 假设已经读入前 b 个元素并且存入了数组a,并且对于 [0, b] 内的元素,找到了以a[b]结尾的最长连续不重复子序列[f, b]
  2. 读入第 b+1 个数据,记为 t
    • a[f, b]不包含t,则新的最长连续不重复子序列为[f, b+1]
    • a[i] == t,则从a[i+1, b+1]重新记录最长子序列,因为如果后面的数据存在比[f, b]更长的子序列,那么肯定该子序列不会包含a[i]

做法:

  1. 双指针来维护该子序列
  2. 用一个set来记录窗口中元素的存在与否(因为数字取值范围是0~10^5,所以直接用下标代表key,内容代表value的数组q来代表set)
#include <bits/stdc++.h>

using namespace std;

int n;
int nums[100010], q[100010];

int main() {
    int res = 0, t, f = 0, b = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &t);
        q[b++] = t;

        if (nums[t]) {
            do nums[q[f]] = 0; while (q[f++] != t);
        }
        nums[t] = 1;
        res = max(res, b-f);
    }
    printf("%d", res);
}
上一篇:acwing算法基础课笔记


下一篇:养猪日记 2022.1.6