方法一:贪心+优先级队列
这道题的核心就是将对组合的模拟,转移到了通过对每个数字出现次数计数来解决。如果如果是可以的列表,那么1之后必定要2,2之后必定要有3.如果这是一个组合那么只需要把这几个数的个数分别减1,然后再判断即可。
class Solution {
public boolean isNStraightHand(int[] hand, int groupSize) {
int n = hand.length;
if (n % groupSize != 0) return false;
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> a - b);
Map<Integer, Integer> map = new HashMap<>();
for (int num : hand) {
map.put(num, map.getOrDefault(num, 0) + 1);
queue.add(num);
}
while (!queue.isEmpty()) {
int num = queue.poll();
if (map.get(num) == 0) continue;
for (int i = num; i < num + groupSize; i++) {
int cnt = map.getOrDefault(i, 0);
if (cnt == 0) return false;
map.put(i, map.get(i) - 1);
}
}
return true;
}
}