题目
题意
给定一个长度为n的序列,选择一个其中的元素 x,你可以删除不含有元素 x 的连续序列,要求最终序列中指剩下元素 x。
思路
消除连续的子序列,例如[1,2,2,3,3,4]为[1,2,3,4],然后统计每个元素出现的次数,第一个出现的元素前面没有元素,最后一个出现的元素后面没有元素,所以都要减一,最后求得最小的出现次数即为答案。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
int a[maxn];
vector<int>v[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
//memset(a,0,sizeof(a));
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
v[a[i]].push_back(i);
}
sort(a,a+n);
int len=unique(a,a+n)-a;
int ans=inf;
for(int i=0;i<len;i++)
{
int fi=-1,num=0;
for(int j=0;j<v[a[i]].size();j++)
{
if(v[a[i]][j]!=fi+1)
num++;
fi=v[a[i]][j];
}
if(v[a[i]].back()!=n-1)
num++;
ans=min(ans,num);
}
cout<<ans<<endl;
for(int i=0;i<len;i++)
v[a[i]].clear();
}
}