森林中的兔子(超详细解析)

森林中的兔子题目题解

题目

森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。

返回森林中兔子的最少数量。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rabbits-in-forest

解析

情况分析:
1、当兔兔报的数字为0时,说明兔子的颜色是独一无二的,总数直接加一即可。
2、当有多个兔兔报相同的数字时,兔兔的颜色可能相同,也可能不同。此处举例说明,当有三只兔子同时报数为一时,若都按相同颜色处理,则该种颜色的兔子数量应该为二(见到的同种颜色兔子和自己本身,但有三只兔子报一,所以是矛盾的)说明三只同时报一的兔子颜色不完全相同,所以此处应该要加入阈值i+1(兔子报的数量加自己本身),若超过这个数则要按不同颜色的兔组来处理。
3、当兔兔报的数量不同时,说明颜色不同,按不同颜色处理。
此题重点考虑报数相同兔兔组(考虑报相同数字出现的次数与说报数字加一的大小比较即可)
未超出时:总数只需加一次即可
超出时:需加报相同数量的兔子数除以阈值取上限。

题解一

下面展示java段代码。

public int numRabbits(int[] answers) {
    //每一个entry代表一种颜色的兔子,每一种颜色最多只能容纳key + 1个兔子,超过就要算别的颜色了
    //key的value最大只能是key+1,否则就需要重置!
    Map<Integer, Integer> map = new HashMap<>();
    int res = 0;
    for(int i = 0; i < answers.length; i++)
    {
        int temp = answers[i];
        if(!map.containsKey(temp)) 
        {
            map.put(temp, 1);
        }
        else if(map.containsKey(temp))
        {
            int value = map.get(temp);
            //达到了最大容量,重置一下
            if(value == temp + 1)
            {
                res += temp + 1;
                map.put(temp, 1);
            }
            //没达到最大容量加进去即可
            else
            {
                value++;
                map.put(temp, value);
            }
        }
    }
    for(Map.Entry<Integer, Integer> entry : map.entrySet())
    {
        //每一个entry都应该加上自己的最大容量(每个颜色的最少兔子数)
        res += entry.getKey() + 1;
    }
    return res;
}

题解二

通过相同报数情况向上取整的方法(C写法)

int numRabbits(int* answers, int answersSize){
    if (answers == NULL || answersSize == 0) {
        return 0;
    }

    int b[1000] = {0};
    for (int i = 0; i < answersSize; i++) {
        b[answers[i]]++;
    }

    int cnt = 0;
    for (int i = 0; i < 1000; i++) {
        cnt += ((b[i] + i) / (i + 1)) * (i + 1);
    }

    return cnt;
}

ε=( o`ω′)ノ整理不易,有帮助的话点个赞再走吧!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值