#include <iostream>
#include <stdio.h>
#include <set>
# include <map>
using namespace std;
int a[ 1000005 ], p;
set< int > com;
map< int , int > mp;
int main ()
{
cin>> p;
com. clear ();
mp. clear ();
for ( int i= 1 ; i<= p; i++)
{
scanf ( "%d" ,& a[ i]);
com. insert ( a[ i]);
}
int total, sum= 0 ;
total= com. size ();
int ans= p, left= 1 , right= 1 ;
while ( left<= p&& right<= p)
{
if ( mp[ a[ right]]== 0 ) sum++;
mp[ a[ right]]++;
while ( mp[ a[ left]]> 1 )
{
mp[ a[ left]]--;
left++;
}
if ( sum== total)
{
if ( right- left+1 < ans) ans= right- left+1 ;
if ( mp[ a[ left]]== 1 ) sum--;
mp[ a[ left]]--;
left++;
}
right++;
}
cout << ans << endl;
return 0 ;
}
题意:
书一共p页,第i页有一个知识点a[i],同一个知识点可以多次出现,想要读连续的书页把所有的知识点覆盖,求要读的最少的页数
思路:
首先set记录所有的知识点
假设从第s页到第t页刚好覆盖所有知识,记录下一个answear,那么s++继续增大t直到再次覆盖所有的知识,就又得到一个answear,去两个answear的最小值,同理继续增大s