【贪心】一手顺子


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值