/** 贪心:将一个数当成一个组中最小的数,在根据该最小数找其它数。
* 思路:将hand进行分组,假设hand长度为 n,必须n % groupSize == 0才可以分组,否则返回false,
* 使用哈希表记录每个数出现的次数,并对数组排序。
* 遍历数组,假设x为数组中的一个数。将x看成一组中最小的数,然后寻找该组中的其他数。
*
* Map集合中getOrDefault()方法作用:如果map中有该关键字返回对应的value值,没有该关键值返回0.
* @auther start
* @create 2024-01-12 13:08
*/
public class L846 {
public boolean isNStraightHand(int[] hand, int groupSize) {
int n = hand.length;
Map<Integer, Integer> map = new HashMap<>();
if (n % groupSize != 0) return false;
Arrays.sort(hand);
for (int x : hand) {
map.put(x, map.getOrDefault(x, 0) + 1);
}
for (int x : hand) {
//如果x不在哈希表中跳过
if (!map.containsKey(x)) continue;
//x在哈希表中,寻找其他数
for (int j = 0; j < groupSize; j++) {
int num = x + j;
//如果其他数不在哈希表中返回false
if (!map.containsKey(num)) {
return false;
}
//将该数的次数减去1
map.put(num, map.get(num) - 1);
//如果该数为0,移除该关键字。
if (map.get(num) == 0) {
map.remove(num);
}
}
}
return true;
}
}