<span>【题解】力扣 781. 森林中的兔子</span>

题目来源

781. 森林中的兔子

思路

方法一

统计分配

用Map统计说同一个数字的兔子有几只。如果说同一个数字,定义为 \(color\) ,的兔子的个数,定义为 \(t\)

  • 如果 \(t \le color\),那么该颜色兔子的数量 \(ans = color+1\)

  • 如果 $t > color $ ,

    • 如果 t%(color+1) != 0 那么该颜色的兔子数量为 \(ans = t/(color+1) * (color+1) + (color+1)\)

      这里 t/(color+1) * (color+1) 的操作相当于相对于 color+1 向下取整。

    • 如果 t%(color+1) == 0 那么给颜色的兔子数量为 \(ans = t/(color+1) * (color+1)\)

class Solution {
    public int numRabbits(int[] answers) {
        int len = answers.length;
        Map<Integer,Integer> map = new HashMap();
        
        // 统计说相同颜色的兔子数量
        for(int i = 0;i<len;i++){
            map.put(answers[i], map.getOrDefault(answers[i], 0)+1);
        }
        
        int res = 0;
        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            int key = entry.getKey();
            int value = entry.getValue();
            int shan = map.get(key) / (key + 1);
            int yu = map.get(key) % (key+1);
            if(shan == 0){
                res += key+1;
            }else {
                res += shan * (key+1);
                if(yu!=0){
                    res += (key+1);
                }
            }
        }
        return res;
    }
}
  • 时间复杂度: \(O(n)\)

  • 空间复杂度: \(O(n)\)

方法二

模拟解法

先排序,然后遍历

class Solution {
    public int numRabbits(int[] answers) {
        int len = answers.length;
        Arrays.sort(answers);
        int ans = 0;
        for(int i = 0;i<len;i++){
            int cnt = answers[i];
            ans += cnt+1;
            int k = cnt;
            // 跳过「数值cnt」后面的cnt个「数值cnt」
            while(k>0 && i+1 < len && answers[i] == answers[i+1]){
                i++;
                k--;
            }
        }
        return ans;
    }
}
  • 时间复杂度:\(O(nlogn)\)
  • 空间复杂度:\(O(1)\)

参考来源

  1. 宫水三叶
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 18:02
好不容易拿到了字节Offer,鼠鼠做后端的,但家里人觉得可能被裁员不稳定,让鼠鼠去投国企,现在好纠结到底该咋选
文档传偷助手:该投就投吧,不过建议别放弃offer 拿到手里的才是最好的
投递字节跳动等公司8个岗位
点赞 评论 收藏
分享
能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 12:04
毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务