题目链接 http://poj.org/problem?id=3320
题意
输入n个数,求最短的连续子序列(子序列包含所有的元素)的长度
题解
#include<cstdio>
#include<set>
#include<map>
using namespace std;
const int M=1000008;
int a[M];
int t;
void solve()
{
set<int>cmp;
for(int i=0;i<t;i++)
cmp.insert(a[i]);//插入元素
int n=cmp.size();//计算有几种元素
map<int,int>mp;//控制首尾指针,让所有元素都存在,且子串尽可能小
int left=0,right=0,sum=0,ans=t;
while(left<t&&right<t)//防止越界
{
if(mp[a[right]]==0)//判断当前不同元素的个数
sum++;
mp[a[right]]++;//统计不同元素出现的次数
while(mp[a[left]]>1)//区间第一个数有重复,首指针后移
{
mp[a[left]]--;
left++;
}
if(sum==n)
{
if(right-left+1<ans)
ans=right-left+1;
if(mp[a[left]]==1)sum--;//寻找下一个子序列,首指针后移
mp[a[left]]--;
left++;
}
right++;//下一个数
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&t);
for(int i=0;i<t;i++)
{
scanf("%d",&a[i]);
} solve();
return 0;
}
357

被折叠的 条评论
为什么被折叠?



