Skip to content

1655. Distribute Repeating Integers

Difficulty Topics

Description

You are given an array of n integers, nums, where there are at most 50 unique values in the array. You are also given an array of m customer order quantities, quantity, where quantity[i] is the amount of integers the ith customer ordered. Determine if it is possible to distribute nums such that:

  • The ith customer gets exactly quantity[i] integers,
  • The integers the ith customer gets are all equal, and
  • Every customer is satisfied.

Return true if it is possible to distribute nums according to the above conditions.

 

Example 1:

Input: nums = [1,2,3,4], quantity = [2]
Output: false
Explanation: The 0th customer cannot be given two different integers.

Example 2:

Input: nums = [1,2,3,3], quantity = [2]
Output: true
Explanation: The 0th customer is given [3,3]. The integers [1,2] are not used.

Example 3:

Input: nums = [1,1,2,2], quantity = [2,2]
Output: true
Explanation: The 0th customer is given [1,1], and the 1st customer is given [2,2].

 

Constraints:

  • n == nums.length
  • 1 <= n <= 105
  • 1 <= nums[i] <= 1000
  • m == quantity.length
  • 1 <= m <= 10
  • 1 <= quantity[i] <= 105
  • There are at most 50 unique values in nums.

Solution

distribute-repeating-integers.py
class Solution:
    def canDistribute(self, nums: List[int], quantity: List[int]) -> bool:
        counter = sorted(Counter(nums).values())
        n, m = len(counter), len(quantity)

        mask_sum = defaultdict(int)

        for mask in range(1 << m):
            for j in range(m):
                if (1 << j) & mask > 0:
                    mask_sum[mask] += quantity[j]

        @cache
        def go(index, mask):
            if mask == 0: return True

            if index == n: return False

            submask = mask

            while submask:
                if counter[index] >= mask_sum[submask] and go(index + 1, submask ^ mask):
                    return True

                submask = (submask - 1) & mask

            return go(index + 1, mask)

        return go(0, (1 << m) - 1)