思考过程
关键在于处理重复的数字 例子 :如果数组中含有小于等于3个2
[…2,2,2…]说明有1或2或3个兔子说有2个兔子根自己颜色一样
相同颜色的兔子数量就是 2 + 1 一旦有4个兔子说有2个兔子根自己颜色一样,那么把其中3个归到1类,剩下的1或2或3再归到另一个颜色,所以要向上取整
计数排序 + 向上取整
code
import java.util.Arrays;
public class LeetCode0781_rabbit {
public static int numbers(int[] answers) {
int n = answers.length;
int[] cnt = new int[1000];
Arrays.sort(answers);
for( int i = 0 ; i < n ; i++) {
cnt[answers[i]]++;
}
int ans = 0;
for( int i = 1 ; i < cnt.length ; i++) {
if(cnt[i] <= i + 1 && cnt[i] >=1) ans = ans + i + 1;
if(cnt[i] > i + 1) ans = ans + (i + 1) * cal(cnt[i],i+1);
}
ans = ans + cnt[0];
return ans;
}
public static int cal(int N,int i){
int m = N % i;
int n = N / i ;
if( m != 0) return n + 1;
return n;
}
public static void main(String[] args) {
int[] a = {0,0,1,1,1};
System.out.print(numbers(a));
}
}