1655. Distribute Repeating Integers
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 exactlyquantity[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 innums
.
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)