题目:
主要的思想还是统计每个数字的出现次数,选择出现最少的元素的出现次数作为结果,在读入数字序列的时候要注意连续的两个位置,如果元素相同的话,就不用重复读入,对结果没有任何影响。(这里就用到了unique函数的另外一种用法,一般去重要先sort整个数列,保证有序,这里就不进行sort,直接使用unique函数,这样可以使得任何相邻的两个位置的元素都不会相同)
要注意在统计数字的出现次数的时候,开头和末尾的元素的出现都不会被统计。(因为开头的元素即使被选中也不会贡献划分的次数,末尾的元素同理)
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 20005;
int b[maxn];
int main()
{
int t,n,ans;
cin >> t;
while(t--)
{
ans = 1e9;
cin >> n;
vector<int>a(n);
for(auto &it: a)
cin >> it;
vector<int> res(n + 1, 1);
n = unique(a.begin(), a.end()) - a.begin(); // 去掉所有连续的两个相同元素的其中一个,保证整个序列里面没有两个相同元素是相同的(不排序使用)
a.resize(n); // 重新规划a的空间为刚好无重复元素的大小 (只保留前 n 个没有相同元素的序列)
for(int i = 0; i < n; i++) // 先记录所有元素的出现次数
{
res[a[i]]++;
}
res[a[n - 1]]--;
res[a[0]]--; // 不记录开头的元素和末尾的元素
for(int i = 0; i < n; i++) // 选择当前出现次数最少的元素的出现次数作为结果
{
ans = min(ans, res[a[i]]);
}
cout << ans << endl;
}
}