Distribute Candies

Alice has n candies, where the ith candy is of type candyType[i]. Alice noticed that she started to gain weight, so she visited a doctor.

The doctor advised Alice to only eat n / 2 of the candies she has (n is always even). Alice likes her candies very much, and she wants to eat the maximum number of different types of candies while still following the doctor's advice.

Given the integer array candyType of length n, return the maximum number of different types of candies she can eat if she only eats n / 2 of them.


Example 1:

Input: candyType = [1,1,2,2,3,3]
Output: 3
Explanation: Alice can only eat 6 / 2 = 3 candies. Since there are only 3 types, she can eat one of each type.

Example 2:

Input: candyType = [1,1,2,3]
Output: 2
Explanation: Alice can only eat 4 / 2 = 2 candies. Whether she eats types [1,2], [1,3], or [2,3], she still can only eat 2 different types.

Example 3:

Input: candyType = [6,6,6,6]
Output: 1
Explanation: Alice can only eat 4 / 2 = 2 candies. Even though she can eat 2 candies, she only has 1 type.


Constraints:

  • n == candyType.length

  • 2 <= n <= 104

  • n is even.

  • -105 <= candyType[i] <= 105

My Solution

We can solve this problem by using a HashSet to keep track of the number of unique candies. We iterate through the array and add the elements to the HashSet. If the number of elements in the HashSet at any point equal the limit, which is n/2, we can just return that value. Otherwise continue until we have iterated through the array and return the size of the HashSet in the end.

Time complexity is O(n) since we iterate through the array once. Space complexity is also O(n) due to the space required for the HashSet.

class Solution {
    public int distributeCandies(int[] candyType) {
        int n = candyType.length;
        int out = 0;
        int limit = n / 2;
        Set<Integer> unique = new HashSet<>();

        for (int num : candyType) {
            unique.add(num);
            if (unique.size() == limit) {
                return limit;
            }
        }

        return unique.size();
    }
}
Previous
Previous

Find the Largest Almost Missing Integer

Next
Next

Subtree of Another Tree