Back to blog
Dec 18, 2024
4 min read

LeetCode 781: Rabbits in Forest

Leetcode 781: Rabbits in Forest solution in Python

Problem Description

LeetCode Problem 781

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

Difficulty: Medium

Tags: array, hash table, math, greedy

Rating: 68.32%

Solution Approach

The key insight to solving this problem lies in understanding how to group rabbits based on their answers. When a rabbit says there are x others of the same color, it means there must be x+1 rabbits of that color in total (including itself). Let’s break down the solution step by step.

Key Concepts

  1. Group Size: When a rabbit answers x, it belongs to a group of x+1 rabbits of the same color.
  2. Grouping Strategy: If we have more rabbits giving the same answer than the group size allows, we need additional complete groups.
  3. Mathematical Ceiling: We use the ceiling division to determine how many complete groups we need for each answer.
    • For example, if we have 5 rabbits answering 2, we need 3 complete groups of 3 rabbits each.

Solution Implementation

from collections import Counter

class Solution:
    def numRabbits(self, answers: List[int]) -> int:
        counts = Counter(answers)
        total_rabbits = 0
        
        for answer, frequency in counts.items():
            group_size = answer + 1  # Size of each color group
            # Calculate number of complete groups needed
            num_groups = (frequency + group_size - 1) // group_size
            # Add all rabbits from complete groups
            total_rabbits += num_groups * group_size
            
        return total_rabbits

Detailed Walkthrough

Let’s walk through Example 1: answers = [1, 1, 2]

  1. First, we count the frequency of each answer:

    • Answer 1 appears twice (freq=2)
    • Answer 2 appears once (freq=1)
  2. Processing answer “1”:

    • Group size = 1 + 1 = 2 rabbits
    • We have 2 rabbits saying “1”
    • They can fit in one group, so num_groups = ⌈2/2⌉ = 1
    • Total rabbits from this answer = 1 * 2 = 2
  3. Processing answer “2”:

    • Group size = 2 + 1 = 3 rabbits
    • We have 1 rabbit saying “2”
    • Need one complete group, so num_groups = ⌈1/3⌉ = 1
    • Total rabbits from this answer = 1 * 3 = 3
  4. Final result = 2 + 3 = 5 rabbits

Let’s also analyze Example 2: answers = [10, 10, 10]

  • All rabbits answer 10
  • Group size = 11 rabbits
  • Three rabbits saying “10” need one group of 11
  • Result = 1 * 11 = 11 rabbits

Complexity Analysis

  • Time Complexity: O(n)O(n), where n is the length of the answers array

    • We iterate through the array once to build the Counter
    • Processing each unique answer takes constant time
  • Space Complexity: O(k)O(k), where k is the number of unique answers

    • The Counter dictionary stores at most k entries
    • Since answers[i] < 1000, space is effectively O(1)