思路
大致想法是用一个队列记录当前正在进行中分组的起始位置,并记录当前分组数,若扫描到的下一个数的个数少于当前分组数,则代表当前有一定数量的分组需要就此停止,按照开始顺序依次出队列即可
代码
#include <cstdio>
#include <string>
#include <vector>
#include <iostream>
#include <cmath>
#include <stack>
#include <map>
#include <algorithm>
#include <climits>
#include <queue>
using namespace std;
int main()
{
int n;
cin >> n;
map<int,int> store;
for(int i = 0;i < n;i++)
{
int k;
scanf("%d",&k);
store[k]++;
}
int res = INT_MAX;
int num = 0;//表示当前分组数量
queue<int> record;
int i = 0;
for(map<int,int> :: iterator it = store.begin();it!=store.end();i++)
{
int q = it->second;
int now = it->first;
if(q > num)
for(int j = 0;j < q - num;j++)
record.push(i);
else if(q < num)
for(int j = 0;j < num - q;j++)
{
int m = record.front();
record.pop();
res = min(res, i - m);
}
num = q;
++it;
if(it == store.end())
{
while(!record.empty())
{
res = min(res,i+1-record.front());
record.pop();
}
break;
}
if(it->first - now!=1)
{
num = 0;
while(!record.empty())
{
res = min(res,i+1-record.front());
record.pop();
}
}
}
cout << res << endl;
}