思路(双指针)
先使用Set来存储总共有多少不同的数字,然后我们使用快慢指针去遍历数组,快指针每次遍历到一个数,将其加入到哈希表,哈希表使用pair存储,第一个元素存数字,第二个元素存数字在快慢指针区间中出现的次数,哈希表的大小就是区间内不同元素的数目,当大小等于总的不同数目个数时,就找到了一个区间,这时候慢指针在开始移动,每次移动,将所指的元素从哈希表的次数减一次,如果变为0,就删掉这个数,然后慢指针一直移动,直到边界或者哈希表大小不等于总共的不同数字的数目。
代码
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
using namespace std;
const int N = 100010;
int n;
int a[N];
unordered_set<int> s;
unordered_map<int, int> t;
int main()
{
cin >> n;
for ( int i = 0; i < n; i ++ )
{
cin >> a[i];
s.insert(a[i]);
}
int res = N;
int m = s.size();
for ( int i = 0, j = 0; i < n; i ++ )
{
t[a[i]] ++;
if ( t.size() == m )
{
res = min(res, i - j + 1);
while ( j < i && t.size() == m )
{
t[a[j]] --;
if ( !t[a[j]] ) t.erase(a[j ++]);
else j ++;
if ( t.size() == m ) res = min(res, i - j + 1);
}
}
}
cout << res << endl;
return 0;
}