题目
类型:贪心
解题思路
在给定 handhand 的情况下,划分方式唯一确定,因此本质上这是一个「模拟」的过程。
使用「哈希表」对 hand 中的数值进行「出现次数」统计,并用于后续 实时 维护剩余元素的出现次数。
使用优先队列维护(小根堆)所有的 hand[i]。每次从优先队列(堆)中取出堆顶元素 t 来 尝试作为「顺子」的发起点/首个元素(当然 t 能够作为发起点的前提是 t 仍是剩余元素,即实时维护的出现次数不为 0 ),然后用 t 作为发起点/首个元素构造顺子,即对 [t, t + 1, … , t + m - 1] 元素的出现次数进行 -1 操作。
若构造过程中没有出现「剩余元素出现次数」不足以 -1 的话,说明整个构造过程没有冲突,返回 True,否则返回 False。
代码
class Solution {public boolean isNStraightHand(int[] hand, int groupSize) {int n = hand.length;if (n % groupSize != 0) {return false;}Arrays.sort(hand);Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();for (int x : hand) {cnt.put(x, cnt.getOrDefault(x, 0) + 1);}for (int x : hand) {if (!cnt.containsKey(x)) {continue;}for (int j = 0; j < groupSize; j++) {int num = x + j;if (!cnt.containsKey(num)) {return false;}cnt.put(num, cnt.get(num) - 1);if (cnt.get(num) == 0) {cnt.remove(num);}}}return true;}}
