leetcode 781. 森林中的兔子(java)

265 篇文章 2 订阅
235 篇文章 0 订阅

leetcode 781. 森林中的兔子

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

题目描述

森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 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

贪心思路

首先,根据兔子的回答:因此我们可以得出以下结论:

  1. 同一颜色的兔子回答的数值必然是一样的
  2. 但回答同样数值的,不一定就是同颜色兔子

举个🌰,假如有 3 只白兔,每只白兔的回答必然都是 2(对应结论 1);但假如有兔子回答了数值 2,可能只是三只白兔,也可能是三只白兔和三只灰兔同时进行了回答(对应结论 2)。
答案要我们求最少的兔子数量。

不妨设有某种颜色的兔子 m 只,它们回答的答案数值为 cnt,那么 m 和 cnt满足什么关系?
显然两者关系为 m=cnt+1。
但如果是在 answers 数组里,回答 cntcnt 的数量为 t 的话呢?这时候我们需要分情况讨论:

t⩽cnt+1: 为达到「最少的兔子数量」,我们可以假定这 t 只兔子为同一颜色,这样能够满足题意,同时不会导致「额外」兔子数量增加(颜色数量最少)。

t>cnt+1 : 我们知道回答 cntcnt 的兔子应该有 cnt+1cnt+1 只。这时候说明有数量相同的不同颜色的兔子进行了回答。为达到「最少的兔子数量」,我们应当将 tt 分为若干种颜色,并尽可能让某一种颜色的兔子为 cnt+1cnt+1 只,这样能够满足题意,同时不会导致「额外」兔子数量增加(颜色数量最少)。

换句话说,我们应该让「同一颜色的兔子数量」尽量多,从而实现「总的兔子数量」最少。

代码

 /**
     * 计算兔子的最低数量
     * @param cs
     * @return
     */
    public int numRabbits(int[] cs) {
        Arrays.sort(cs);
        int ans = 0;
        int n = cs.length;
        for (int i = 0; i < n;i++){
            int num = cs[i];
            ans += (num + 1);
            int k = num;
            while (k-- > 0 && i + 1 < n && cs[i] == cs[i + 1]){
                i++;
            }
        }
        return ans;
    }

贪心算法

贪心算法-跳跃游戏问题

贪心算法-字符串数组能拼接出的最小字典序

贪心算法-分金问题,返回分割最小代价

贪心算法–安排最多会议次数

贪心算法-用最少的灯照亮所有街道

贪心算法–计算项目最大收益

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值