友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

781. 森林中的兔子

森林中有未知数量的兔子。提问其中若干只兔子 "还有多少只兔子与你(指被提问的兔子)颜色相同?",将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。

给你数组 answers ,返回森林中兔子的最少数量。

示例 1:

输入:answers = [1,1,2]
输出:5
解释:
两只回答了 "1" 的兔子可能有相同的颜色,设为红色。
之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 "2" 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5 只:3 只回答的和 2 只没有回答的。

示例 2:

输入:answers = [10,10,10]
输出:11

提示:

  • 1 <= answers.length <= 1000

  • 0 <= answers[i] < 1000

思路分析

本质上,是一道向上取整的数学题。

取整公式

\[\left\lceil \frac{a}{b} \right\rceil = \left\lfloor \frac{a+b-1}{b} \right\rfloor\]
  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-06-17 22:19:42
 */
public int numRabbits(int[] answers) {
  Map<Integer, Integer> counter = new TreeMap<>();
  for (int num : answers) {
    counter.put(num, counter.getOrDefault(num, 0) + 1);
  }
  List<Integer> nums = new ArrayList<>(counter.size());
  int result = 0;
  for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
    int k = entry.getKey();
    int v = entry.getValue();
    if (v % (k + 1) == 0) {
      result += v;
    } else {
      result += (v / (k + 1) + 1) * (k + 1);
    }
  }
  return result;
}