森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers
数组里。
返回森林中兔子的最少数量。
示例: 输入: answers = [1, 1, 2] 输出: 5 解释: 两只回答了 "1" 的兔子可能有相同的颜色,设为红色。 之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。 设回答了 "2" 的兔子为蓝色。 此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。 因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。 输入: answers = [10, 10, 10] 输出: 11 输入: answers = [] 输出: 0
说明:
answers
的长度最大为1000
。answers[i]
是在[0, 999]
范围内的整数。
Review:
把问题想成找数组中的重复元素,这道题就好解多了
我们可以用hashtable(可以用数组索引)存储,key = answers[i],value = answers[i]
当数组中不存在key==answers[i]
时,res+=answers[i]+1
比如有5只兔子喊了5(加上自己共6只兔子),那么这5只就可以当作同一颜色
但是万一有7只兔子喊了5,那多的那一只为自己一个颜色
如何判断喊5的是否为多出来颜色的兔子呢?
value可以记录最多还可以存在几个喊5的同一颜色的兔子
即每次碰到喊5的且前面已经有兔子喊5了,就将对应value--
Code:
非常简单的思路,但是在leetcode-cn居然..
而国外是这样
看来大牛不玩leetcode-cn...
class Solution {
public int numRabbits(int[] answers) {
int[] record = new int[1000];
int res = 0;
for (int a : answers) {
if (record[a]++ % (a + 1) == 0) {
res += a + 1;
}
}
return res;
}
}
或者
class Solution {
public int numRabbits(int[] answers) {
int[] record = new int[1000];
int res = 0;
for (int ans : answers) {
if (record[ans]==0 || ans == 0) {
res += ans + 1;
record[ans]=ans;
}else {
record[ans]--;
}
}
return res;
}
}