A-Car Show
题意提炼
给出一个长度为 n 的整数数组只包含 1-n 输出包含所有数的 区间个数
思考分析
用双指针,用哈希表存储指针内包含的数
AC代码
#include<iostream>
using namespace std;
const int MAX=1e6+5;
int arr[MAX];
int HAsh[MAX];
int main()
{
int n,m,l,p,cnt,ans=0;
bool flag=false;
cin>>n>>m;
cnt=m;
for(int i=0;i<n;i++)//读入数据
{
cin>>arr[i];
if(HAsh[arr[i]]==0) //哈希表存储区间内各数的出现次数
{
cnt--;
}
HAsh[arr[i]]++;
if(cnt==0) //当出现全部的数时记录该点的位置
{
p=i;
break;
}
}
if(cnt!=0)
{
cout<<'0'<<endl;
return 0;
}
for(int i=p+1;i<n;i++) //输入完 剩余数据
cin>>arr[i];
ans+=n-p; //将第一次答案加入
l=0; // 左指针 ,p为又指针
while(p<n)
{
l++;
HAsh[arr[l-1]]--;
if(HAsh[arr[l-1]]==0)
{
while(arr[p]!=arr[l-1] && p<n)
{
p++;
if(p==n)
{
flag=true;
break;
}
HAsh[arr[p]]++;
}
if(flag)
break;
ans+=n-p;
// cout<<"ans="<<ans<<endl;
}
else
ans+=n-p;
// cout<<"ans="<<ans<<endl;
}
cout<<ans<<endl;
}