贪心:森林中的兔子

题目描述

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

题解

思路

贪心思想略加一些脑筋急转弯。
很容易捕捉到题目的两个关键点:

  • 具有相同颜色的兔子的answer[i]必相同,亦即,某个白兔子告诉你还有10个兔子和自己颜色相同,那么如果还有别的白兔子告诉你这个信息,她肯定也是告诉你,有10个兔子和自己颜色相同。
  • 最多有11个白兔子告诉你还有10个兔子和自己颜色相同(亦即,最多有11个answers[i]等于10时表示白兔子,如果另外还有ansers[i]为10,那肯定是别的颜色)。

代码

class Solution {
    public int numRabbits(int[] answers) {
        int[]numArr = new int[1000];//answers[i] 是在 [0, 999] 范围内的整数。为求方便直接开辟1000的数组,当然,最好用HashMap
        for(int i:answers){//统计每个i的数量
            numArr[i]++;
        }
        int num = 0;
        for(int i=999;i>=0;i--){//遍历每个数量不为0的i,同样,用HashMap更省时间空间,这里只是求方便。
            if(numArr[i]!=0){
                num += (i+1)*((numArr[i]+i)/(i+1));//如果有1000个999,说明这1000个999是同一个颜色,外加兔子自己,共1000个,那么有多少个(1000个999)?不足1000个按1个计算
            }//例如有1500个999,1500个中有一个整1000,一个500,整1000说明1000只兔子颜色相同,且这1000只兔子都告诉了还有多少兔子和自己颜色相同的信息
        }//剩余500个999当作1000个兔子计算,即有500只兔子告诉了还有多少兔子和自己颜色相同的信息,还有500只未告诉。
        return num;
    }
}
posted @ 2021-04-04 23:40  HickeyZhang  阅读(53)  评论(0编辑  收藏  举报