每日一题时间:
2020-04-04
题目链接: 781. 森林中的兔子 官方题解链接: 森林中的兔子
森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量。
示例:
输入: answers = [1, 1, 2]
输出: 5
解释:
两只回答了 "1" 的兔子可能有相同的颜色,设为红色。
之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 "2" 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。
输入: answers = [10, 10, 10]
输出: 11
输入: answers = []
输出: 0
说明:
answers
的长度最大为1000。answers[i]
是在 [0, 999]
范围内的整数。解题思路: 当 x
只兔子回答 y
时, 若 x <= y + 1
则该颜色最少会产生 y + 1
只兔子, 若 x > y + 1
则产生 ceil( x / (y + 1)) * (y + 1)
个, 注意整数除法问题。
class Solution {
public:
int numRabbits(vector<int>& answers) {
unordered_map<int, int> count;
int res = 0;
for (auto &n: answers) {
count[n]++;
}
for (auto &[y, x] : count) {
// 针对整数除法的向上取整优化
res += (x + y) / (y + 1) * (y + 1);
}
return res;
}
};
O(N)
O(N)
class Solution {
public:
int numRabbits(vector<int>& answers) {
unordered_map<int, int> count;
int res = 0;
for (auto &n: answers) {
count[n]++;
if (count[n] == n + 2) count[n] = 1;
if (count[n] == 1) res += n + 1;
}
return res;
}
};
O(N)
O(N)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。