Solution Link to heading

781. Rabbits in Forest (Medium)

There is a forest with an unknown number of rabbits. We asked n rabbits “How many rabbits have the same color as you?” and collected the answers in an integer array answers where answers[i] is the answer of the ith rabbit. Given the array answers, return the minimum number of rabbits that could be in the forest. Example 1:

Input: answers = [1,1,2]
Output: 5
Explanation:
The two rabbits that answered "1" could both be the same color, say red.
The rabbit that answered "2" can't be red or the answers would be inconsistent.
Say the rabbit that answered "2" was blue.
Then there should be 2 other blue rabbits in the forest that didn't answer into the array.
The smallest possible number of rabbits in the forest is therefore 5: 3 that answered plus 2 that
didn't.

Example 2:

Input: answers = [10,10,10]
Output: 11

Constraints:

  • 1 <= answers.length <= 1000
  • 0 <= answers[i] < 1000

Solution Link to heading

If we want the amount of rabbits is the maximum, we need to make the rabbits that answer the same number is the same color, if possible.

We use a hash table unordered_map<int, int> ump to record for each answer the amount of rabbits that answer the answer, key means the answer, value means the amount of rabbits that answer the answer.

If ump[i] > i + 1, then there is more than one kind of color among these rabbits. The least amount of kind of color is (ump[i] - 1) / (i + 1) + 1, for each kind of color, there are i + 1 rabbits.

Code Link to heading

class Solution {
  public:
    int numRabbits(vector<int> &answers) {
        unordered_map<int, int> ump;
        int res = 0;
        for (auto &num : answers) {
            ump[num]++;
        }
        for (auto &num : ump) {
            // if (num.second % (num.first + 1) == 0) {
            //     res += num.second;
            // } else {
            //     res  += (num.second / (num.first + 1) + 1) * (num.first + 1);
            // }
            res += ((num.second - 1) / (num.first + 1) + 1) * (num.first + 1);
        }
        return res;
    }
};