题目
Alice 手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是 groupSize ,并且由 groupSize 张连续的牌组成。
给你一个整数数组 hand 其中 hand[i] 是写在第 i 张牌,和一个整数 groupSize 。如果她可能重新排列这些牌,返回 true ;否则,返回 false
解题思路
模拟。将每个牌出现的次数用哈希计数,再从小到大枚举顺子的起始牌,按照 groupSize
的长度依次更新牌数,如果出现牌数不够的情况则返回 false
。 TreeMap
比 HashMap
要慢好多。
代码
class Solution {
public boolean isNStraightHand(int[] hand, int groupSize) {
if (hand.length % groupSize != 0) return false;
Map<Integer, Integer> map = new HashMap<>();
Queue<Integer> queue = new PriorityQueue<>();
for (int han : hand) {
map.put(han, map.getOrDefault(han, 0) + 1);
queue.add(han);
}
while (!queue.isEmpty()) {
int now = queue.poll();
int nowNum = map.getOrDefault(now, 0);
if (nowNum == 0) continue;
for (int i = 0; i < groupSize; i++) {
int tmp = map.getOrDefault(now + i, 0);
if (tmp - nowNum < 0) return false;
else map.put(now + i, tmp - nowNum);
}
}
return true;
}
}