【ACWing】799. 最长连续不重复子序列

题目地址:

https://www.acwing.com/problem/content/801/

给定一个长n nn的整数数列A AA,求其最长无重复数的子区间长度。

输入格式:
第一行包含整数n nn。第二行包含n nn个整数(均在0 ∼ 100000 0\sim 1000000100000范围内),表示整数序列。

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

数据范围:
1 ≤ n ≤ 100000 1\le n\le 1000001n100000

思路是双指针。我们枚举子区间右端点i ii,并维护满足条件的区间的最左的左端点j jj,容易发现,当i ii右移一格的时候,左端点不会回退,并且A [ i ] A[i]A[i]是唯一可能出现重复的数字。当出现重复了,就右移j jj缩小区间,直到没有重复为止。代码如下:

#include <iostream>
#include <unordered_map>
using namespace std;

const int N = 100010;
int n, a[N];

int main() {
  cin >> n;
  for (int i = 0; i < n; i++) scanf("%d", &a[i]);

  int res = 0;
  unordered_map<int, int> map;
  for (int i = 0, j = 0; i < n; i++) {
    map[a[i]]++;
    while (j < i && map[a[i]] > 1) map[a[j++]]--;
    res = max(res, i - j + 1);
  }

  cout << res << endl;
}

时间复杂度O ( n ) O(n)O(n),空间O ( 1 ) O(1)O(1)


版权声明:本文为qq_46105170原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。