【贪心】一手顺子

【贪心】一手顺子_第1张图片


/** 贪心:将一个数当成一个组中最小的数,在根据该最小数找其它数。
 *  思路:将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 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;
    }
}

你可能感兴趣的:(刷题笔记,算法,数据结构,哈希算法)