题目描述
找规律
思路见注释
class Solution {
//思路:相同数字说明同一群,不同说明不同群,没群个数为该数字+1
public:
int numRabbits(vector<int>& answers) {
unordered_map<int, int> m;
int ans = 0;
//统计每个数字出现的次数
for(int num : answers) {
m[num]++;
}
for(auto p : m) {
//刚好可以凑出n组
//比如 2 2 2 凑出3只一组
//比如 3 3 3 3 3 3 3 3 凑出4只两组
if(p.second % (p.first + 1) == 0) {
ans += p.second / (p.first + 1) * (p.first + 1);
//不能凑齐,则在凑齐几组的基础上加多出来的部分
} else {
ans += p.second / (p.first + 1) * (p.first + 1) + p.first + 1;
}
}
return ans;
}
};
时间O(n)
空间O(n)
其实ifelse的部分可以合并为一个公式,想要知道的可以看一下
ans += (p.second + p.first) / (p.first + 1) * (p.first + 1);
具体证明自己去看lc题解吧