Alice has a hand of cards, given as an array of integers.
Now she wants to rearrange the cards into groups so that each group is size W, and consists of W consecutive cards.
Return true if and only if she can.
Example 1:
Input: hand = [1,2,3,6,2,3,4,7,8], W = 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], W = 4
Output: false
Explanation: Alice's hand can't be rearranged into groups of 4.
Constraints:
1 <= hand.length <= 10000
0 <= hand[i] <= 10^9
1 <= W <= hand.length
Note: This question is the same as 1296: https://leetcode.com/problems/divide-array-in-sets-of-k-consecutive-numbers/
class Solution:
    def isNStraightHand(self, hand: List[int], W: int) -> bool:
        hand = collections.Counter(hand)
        while True:
            if len(hand) == 0:
                return True
            m = min(hand)
            for c in range(m, m + W):
                if c not in hand:
                    return False
                if hand[c] == 1:
                    del hand[c]
                else:
                    hand[c] -= 1

class Solution:
    def isNStraightHand(self, hand: List[int], W: int) -> bool:
        hand = collections.Counter(hand)
        while True:
            if len(hand) == 0:
                return True
            m = min(hand)
            for c in range(m, m + W):
                if c not in hand:
                    return False
                if hand[c] == 1:
                    del hand[c]
                else:
                    hand[c] -= 1
