All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0801_0900.s0846_hand_of_straights.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0801_0900.s0846_hand_of_straights;

// #Medium #Array #Hash_Table #Sorting #Greedy #2022_03_24_Time_19_ms_(96.16%)_Space_43_MB_(93.42%)

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 846 - Hand of Straights\.
 *
 * Medium
 *
 * Alice has some number of cards and she wants to rearrange the cards into groups so that each group is of size `groupSize`, and consists of `groupSize` consecutive cards.
 *
 * Given an integer array `hand` where `hand[i]` is the value written on the ith card and an integer `groupSize`, return `true` if she can rearrange the cards, or `false` otherwise.
 *
 * **Example 1:**
 *
 * **Input:** hand = [1,2,3,6,2,3,4,7,8], groupSize = 3
 *
 * **Output:** true
 *
 * **Explanation:** Alice's hand can be rearranged as [1,2,3],[2,3,4],[6,7,8]
 *
 * **Example 2:**
 *
 * **Input:** hand = [1,2,3,4,5], groupSize = 4
 *
 * **Output:** false
 *
 * **Explanation:** Alice's hand can not be rearranged into groups of 4.
 *
 * **Constraints:**
 *
 * *   1 <= hand.length <= 104
 * *   0 <= hand[i] <= 109
 * *   `1 <= groupSize <= hand.length`
 *
 * **Note:** This question is the same as 1296: [https://leetcode.com/problems/divide-array-in-sets-of-k-consecutive-numbers/](https://leetcode.com/problems/divide-array-in-sets-of-k-consecutive-numbers/)
**/
public class Solution {
    public boolean isNStraightHand(int[] hand, int groupSize) {
        int len = hand.length;
        if (len % groupSize != 0) {
            return false;
        }
        Arrays.sort(hand);
        Map map = new HashMap<>();
        for (int num : hand) {
            int cnt = map.getOrDefault(num, 0);
            map.put(num, ++cnt);
        }
        for (int num : hand) {
            int cnt = map.get(num);
            if (cnt <= 0) {
                continue;
            }
            map.put(num, --cnt);

            int loop = 1;
            while (loop < groupSize) {
                int curCnt = map.getOrDefault(num + loop, 0);
                if (curCnt <= 0) {
                    return false;
                }
                map.put(num + loop, --curCnt);
                ++loop;
            }
        }
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy