781. 森林中的兔子

303 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

781. 森林中的兔子

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

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

示例: 输入: answers = [1, 1, 2] 输出: 5 解释: 两只回答了 "1" 的兔子可能有相同的颜色,设为红色。 之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。 设回答了 "2" 的兔子为蓝色。 此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。 因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。

输入: answers = [10, 10, 10] 输出: 11

输入: answers = [] 输出: 0

解题思路

两只相同颜色的兔子看到的其他同色兔子数必然是相同的。反之,若两只兔子看到的其他同色兔子数不同,那么这两只兔子颜色也不同。

假如有 3 只白兔,每只白兔的回答必然都是 2;但假如有兔子回答了数值 2,可能只是三只白兔,也可能是三只白兔和三只灰兔同时进行了回答

因此将具有报出相同数量同类的兔子作为一组,遍历一次数组,就可以知道每个组内缺了多少个兔子,再加上原数组中的兔子个数,就是森林中兔子的最少数量。

代码

class Solution {
    public int numRabbits(int[] answers) {

        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < answers.length; i++) {
            if(answers[i]==0) continue; //独一无二的兔子
            map.put(answers[i],map.getOrDefault(answers[i],answers[i]+1)-1);
            if(map.get(answers[i])==0) map.remove(answers[i]);//这个组已经查完了,移除
        }
        int res=answers.length;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            res+=entry.getValue();
        }
        return res;
    }
}

时间复杂度:O(n),其中 n 是数组 answers 的长度。

空间复杂度:O(n)。最坏情况下,哈希表中含有 n 个元素。