1. 题目来源
2. 题目解析
一道蛮有趣的问题,代码简单,思维量大,典型的脑筋急转弯问题。
思路:
-
哈希表统计回答相同数字的兔子数量,因为回答相同数字的可能是同颜色也可能有不同颜色,但是回答不同数字的两指兔子颜色必不相同。
-
假设回答数字 k k k 的兔子有 v v v 只,那么至少就有 ⌈ v k + 1 ⌉ \lceil \frac v {k+1} \rceil ⌈k+1v⌉ 种颜色,每种颜色都有 k + 1 k+1 k+1 只兔子。
-
这里涉及一个上取整与下取整的转换,即 ⌈ a b ⌉ = ⌊ a + b − 1 b ⌋ \lceil \frac a b \rceil=\lfloor \frac {a + b-1} b\rfloor ⌈ba⌉=⌊ba+b−1⌋。简单的分类讨论分子是否能整除分母即可得到该式,也是常用的技巧!
-
时间复杂度: O ( n ) O(n) O(n)。
-
空间复杂度: O ( n ) O(n) O(n)
其中代码中采用的 for (auto &[k, v] : hs)
遍历哈希表的方式,是 C++17
的新特性,结构化绑定,若本地编译器或 oj
未支持 c++17
会报错!
代码:
class Solution {
public:
int numRabbits(vector<int>& answers) {
unordered_map<int, int> hs;
for (auto &e : answers) hs[e] ++ ;
int res = 0;
for (auto &[k, v] : hs)
res += (v + k) / (k + 1) * (k + 1);
return res;
}
};