思路(双指针)
先使用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;
}