1655. 分配重复整数Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
给你一个长度为 n 的整数数组 nums ,这个数组中至多有 50 个不同的值。同时你有 m 个顾客的订单 quantity ,其中,整数 quantity[i] 是第 i 位顾客订单的数目。请你判断是否能将 nums 中的整数分配给这些顾客,且满足:
- 第 i 位顾客 恰好 有 quantity[i] 个整数。
- 第 i 位顾客拿到的整数都是 相同的 。
- 每位顾客都满足上述两个要求。 如果你可以分配 nums 中的整数满足上面的要求,那么请返回 true ,否则返回 false 。
示例 1:
输入:nums = [1,2,3,4], quantity = [2]
输出:false
解释:第 0 位顾客没办法得到两个相同的整数。
示例 2:
输入:nums = [1,2,3,3], quantity = [2]
输出:true
解释:第 0 位顾客得到 [3,3] 。整数 [1,2] 都没有被使用。
示例 3:
输入:nums = [1,1,2,2], quantity = [2,2]
输出:true
解释:第 0 位顾客得到 [1,1] ,第 1 位顾客得到 [2,2] 。
提示:
- n == nums.length
- 1 <= n <= 105
- 1 <= nums[i] <= 1000
- m == quantity.length
- 1 <= m <= 10
- 1 <= quantity[i] <= 105
- nums 中至多有 50 个不同的数字。
# 思路
回溯
# 解法
class Solution {
public boolean canDistribute(int[] nums, int[] quantity) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) map.put(num, map.getOrDefault(num, 0) + 1);
Arrays.sort(quantity);
return backtrack(map, quantity, quantity.length - 1);
}
boolean backtrack(Map<Integer, Integer> map, int[] quantity, int i) {
if (i < 0) return true;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
Integer num = entry.getKey(), count = entry.getValue();
if (count < quantity[i]) continue;
map.put(num, count - quantity[i]);
if (backtrack(map, quantity, i - 1)) return true;
map.put(num, count);
}
return false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 总结
- 分析出几种情况,然后分别对各个情况实现


