2021.4.4 森林中的兔子
题目描述
森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量。
示例:
输入: answers = [1, 1, 2]
输出: 5
解释:
两只回答了 “1” 的兔子可能有相同的颜色,设为红色。
之后回答了 “2” 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 “2” 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。
输入: answers = [10, 10, 10]
输出: 11
输入: answers = []
输出: 0
思路1
将给予的数组里相同的数字匹配,即认为他们是同一种颜色,但不能让他们的总数超过他们报出的数字+1,比如 1 1 1,不能认为这三个是同一种颜色,可以用HashMap存储数字,以"颜色"(即兔子报的数字)为key,value则设为当前颜色还能匹配多少个兔子,如果为0则remove。
public int numRabbits(int[] answers) {
HashMap<Integer,Integer> arr = new HashMap<>();
int sum = answers.length;//初始化默认n个兔子颜色都不同
for (int answer : answers) {
if (arr.containsKey(answer) && arr.get(answer) != 0) {
arr.replace(answer,arr.get(answer) - 1);
sum -= 1;//匹配成功意味着初始化情况是错的,有两个兔子颜色相同,则sum应该-1
if(arr.get(answer) == 0) //如果value为0不能再匹配兔子,应该移除
arr.remove(answer);
} else {
if(answer != 0) { //数字为0意味着这兔子颜色唯一,初始化时已经加过,无需添加
arr.put(answer,answer);
sum += answer;
}
}
}
return sum;
}
以上代码其实可以优化一下,无需用到map,只需要用一个数组,用空间换时间。
public int numRabbits(int[] answers) {
int[] color = new int[1000];
int sum = answers.length;
for(int i : answers){
if(color[i] <= 0){
color[i] = i;
sum += i;
}else {
color[i]--;
sum -= 1;
}
}
return sum;
}