classSolution{publicintnumRabbits(int[] answers){// 统计下标所指的数字出现的次数int[] arr =newint[1000];// 统计所出现的最大的数字int _max =0;// 统计结果int ans =0;// 遍历数组// i 指其他和自己有相同的颜色的兔子的个数for(int i : answers){// 如果为 0,则说明该颜色的兔子没有同颜色的伙伴// 即只有一个此颜色的兔子if(i ==0) ans++;
arr[i]++;if(i > _max) _max = i;}for(int i =1; i <= _max; i++){// 注意:题目说告诉你数据的只是其中一些兔子// 所以会有类似于 [2, 2] 的情况// 即有三个兔子同一颜色,但只有两个兔子说出来了// i+1: 某一颜色的兔子的个数// ((arr[i] - 1) / (i + 1) + 1): i 为某个值时,// 至少会有多少种不同的颜色(题目就是求最少的情况)// 可以换成 ans += ((arr[i] + i) / (i + 1)) * (i + 1);// (这行代码可以不用if,用了效率高点)// if不可省略:后面的运算至少会让 ans += (i+1)// 所以得排除掉 arr[i] = 0 的情况if(arr[i]>0) ans +=((arr[i]-1)/(i +1)+1)*(i +1);}return ans;}}
解法二
classSolution{publicintnumRabbits(int[] answers){int[] arr =newint[1000];int _max =0;int ans =0;for(int i : answers)
arr[i]++;}for(int i =0; i <=1000; i++){
ans +=((arr[i]+ i)/(i +1))*(i +1);}return ans;}}
思考
((arr[i] - 1) / (i + 1) + 1) * (i + 1);
ans += ((arr[i] + i) / (i + 1)) * (i + 1);
这两行代码分别是什么意思呢?区别在哪呢?
------------------------------------------------------
答:这两行代码的思路都是 颜色种数 乘与 兔子个数
其中 (i + 1) 代表兔子个数
(1)(arr[i] - 1) / (i + 1) + 1 :
默认颜色种数为 1,所增加的种数为(arr[i] - 1) / (i + 1)。
作 arr[i] - 1 的处理是因为 要排除 arr[i] / (i + 1) == 1 的情况
即 当某颜色兔子总数与该兔子总数相等时,不能 +1
(因为默认为 1,只能是多一种颜色才能 +1)
(2)(arr[i] + i) / (i + 1) :
此处 +i 就是 让 arr[i] 在 1 ~ i+1 的范围都可以统计一种颜色