【Leetcode 每日一题】781. 森林中的兔子

问题背景

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

给你数组 a n s w e r s answers answers,返回森林中兔子的最少数量。

数据约束

  • 1 ≤ a n s w e r s . l e n g t h ≤ 1000 1 \le answers.length \le 1000 1≤answers.length≤1000
  • 0 ≤ a n s w e r s [ i ] < 1000 0 \le answers[i] < 1000 0≤answers[i]<1000

解题过程

找规律,考虑到要求数量最少,假设当前数组元素是 i t e m item item,它共有 n u m num num 个等值元素,那么答案会增加 ⌈ n u m i t e m + 1 ⌉ \lceil \frac{num}{item + 1} \rceil ⌈item+1num⌉。

建立数组元素与数量之间的哈希映射,再遍历计算结果即可。

具体实现

java 复制代码
class Solution {
    public int numRabbits(int[] answers) {
        Map<Integer, Integer> count = new HashMap<>();
        for (int item : answers) {
            count.merge(item, 1, Integer::sum);
        }
        int res = 0;
        for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
            int item = entry.getKey();
            int num = entry.getValue();
            res += (item + num) / (item + 1) * (item + 1);
        }
        return res;
    }
}
相关推荐
灵感__idea1 小时前
Hello 算法:贪心的世界
前端·javascript·算法
澈2072 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
ambition202422 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_2 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi2 小时前
前缀和差分
算法·图论
代码旅人ing3 小时前
链表算法刷题指南
数据结构·算法·链表
Yungoal3 小时前
常见 时间复杂度计算
c++·算法
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
不爱吃炸鸡柳4 小时前
单链表专题(完整代码版)
数据结构·算法·链表
CylMK4 小时前
题解:AT_abc382_d [ABC382D] Keep Distance
算法