题目地址:
https://www.acwing.com/problem/content/801/
给定一个长n nn的整数数列A AA,求其最长无重复数的子区间长度。
输入格式:
第一行包含整数n nn。第二行包含n nn个整数(均在0 ∼ 100000 0\sim 1000000∼100000范围内),表示整数序列。
输出格式:
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围:
1 ≤ n ≤ 100000 1\le n\le 1000001≤n≤100000
思路是双指针。我们枚举子区间右端点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版权协议,转载请附上原文出处链接和本声明。