题目链接:登录—专业IT笔试面试备考平台_牛客网
题目:
样例输入:
5 3
1 2 3 2 1
样例输出:
5
题意:给定n和k,然后给定n个数,n个数都是介于1~k的,问我们满足一个区间内恰好出现1~k所有数的区间数目。
分析:因为这个题目给的条件是只有k种数,那么也就是说我们直接求一个区间内数的种数大于等于k的区间数就是答案所要求的区间数。直接用双指针求解即可,细节见代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+10;
int a[N],cnt[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int i=1,j=1,count=0;
long long ans=0;
while(j<=n)
{
cnt[a[j]]++;
if(cnt[a[j]]!=1)
{
j++;
continue;
}
count++;
if(count==k)
{
ans+=n-j+1;
while(true)
{
cnt[a[i]]--;
if(!cnt[a[i]])
{
count--;
i++;
break;
}
i++;
ans+=n-j+1;
}
}
j++;
}
printf("%lld\n",ans);
return 0;
}