分析
定义一个哈希表mp,记录每个数出现的个数,同时把每个数插入到集合中。
遍历集合s:
- 0:没有人与自己相同,直接加mp[0]
- 其他数x:每组大小为$(x+1)$。出现的次数为$mp[x]$
求出$mp[x]$与$(x+1)$的商$k=\frac{mp[x]}{x+1}$和余数$r=mp[x]\%(x+1)$
若余数r=0,说明刚好有k组,加上$k\*(x+1)$
余数不为0,需要k+1组,加上$(k+1)\*(x+1)$
样例
[0,0,1,1,1]
[0,0,0,1,1]
C++ 代码
class Solution {
public:
unordered_map<int,int> mp; //开一个哈希表
set<int> s;
int ans;
int numRabbits(vector<int>& answers) {
int n=answers.size();
if(n<1) return 0;
for(int i=0;i<n;i++)
{
mp[answers[i]]++;
s.insert(answers[i]);
}
for(auto x:s)
{
if(!x) ans+=mp[x]; //0,直接加
else{
int k=mp[x]/(x+1),r=mp[x]%(x+1);
if(r) ans+=(k+1)*(x+1); //余数为0,加上k+1组,每组x+1只
else ans+=k*(x+1); //余数不为0,直接加k组,每组x+1只
}
}
return ans;
}
};