Hard
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:
ith customer gets exactly quantity[i] integers,ith customer gets are all equal, andReturn 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.length1 <= n <= 1051 <= nums[i] <= 1000m == quantity.length1 <= m <= 101 <= quantity[i] <= 10550 unique values in nums.import java.util.Arrays;
public class Solution {
public boolean canDistribute(int[] nums, int[] quantity) {
int[] counter = count(nums);
Arrays.sort(quantity);
return dfs(counter, quantity, quantity.length - 1);
}
private boolean dfs(int[] counter, int[] quantity, int quantityId) {
if (quantityId < 0) {
return true;
}
for (int i = 0; i < counter.length; i++) {
if (i > 0 && counter[i] == counter[i - 1]) {
continue;
}
if (counter[i] >= quantity[quantityId]) {
counter[i] -= quantity[quantityId];
if (dfs(counter, quantity, quantityId - 1)) {
return true;
}
counter[i] += quantity[quantityId];
}
}
return false;
}
private int[] count(int[] nums) {
int[] counter = new int[1001];
for (int n : nums) {
counter[n]++;
}
Arrays.sort(counter);
return Arrays.copyOfRange(counter, counter.length - 50, counter.length);
}
}