LeetCode.781 森林中的兔子

该博客探讨了LeetCode中的781号问题——森林中的兔子。根据兔子回答的不同数字,计算至少有多少种不同的颜色。文章通过举例和解析思路,展示了如何通过计算(x+y)/(y+1)来确定颜色种类,并提供了Java实现的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题

https://leetcode-cn.com/problems/rabbits-in-forest/

在这里插入图片描述

思路

先参考官方题解

设有x只兔子回答了y
则至少有x/(y+1)中不同的颜色
例如{3,3,3,3}4/(3+1)=1种不同的颜色
例如{3,3,3,3, 3,3,3,3}8/(3+1)=2种不同的颜色
例如{3,3,3,3, 3,3}6/(3+1)=1种不同的颜色,其实这时候应该是2种不同颜色的,所以需要向上取整
即:x/(y+1)为整数时,恰好就是x/(y+1)种不同的颜色
       x/(y+1)为小数时,应该是x/(y+1)+1种不同的颜色
归并以上两种情况,=> (x+y)/(y+1)种不同的颜色


每种颜色的兔子,最多有y+1只,故有式子: res += (x+y)/(y+1)*(y+1);


题解

package com.leetcode.code;

import java.util.HashMap;
import java.util.Map;

/**
 * @Description:
 * @ClassName: Code781
 * @Author: ZK
 * @Date: 2021/4/4 00:21
 * @Version: 1.0
 */
public class Code781 {

    public static void main(String[] args) {
//        int[] answers = {1,1,1,2,2};
        int[] answers = {10,10,10};
        System.out.println(numRabbits(answers));
    }

    public static int numRabbits(int[] answers) {
        Map<Integer, Integer> map = new HashMap<>();
        int len = answers.length;
        for (int i = 0; i < len; i++) {
            int num = answers[i];
            map.put(num, map.getOrDefault(num, 0)+1);
        }

        int res = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
//            设有x只兔子回答了y
//            则至少有x/(y+1)中不同的颜色
//            例如{3,3,3,3},4/(3+1)=1种不同的颜色
//            例如{3,3,3,3, 3,3,3,3},8/(3+1)=2种不同的颜色
//            例如{3,3,3,3, 3,3},6/(3+1)=1种不同的颜色,其实这时候应该是2种不同颜色的,所以需要向上取整
//            即:x/(y+1)为整数时,恰好就是x/(y+1)种不同的颜色
//               x/(y+1)为小数时,应该是x/(y+1)+1种不同的颜色
//            归并以上两种情况,=> (x+y)/(y+1)种不同的颜色

//            每种颜色的兔子,最多有y+1只,故有如下的式子
            int y = entry.getKey();
            int x = entry.getValue();
            res += (x+y)/(y+1)*(y+1);
        }

        return res;
    }

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难过的风景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值