[Leetcode] Problem 846 - Hand of Straights

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

No.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].

No.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

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public boolean isNStraightHand(int[] hand, int W) {
int n = hand.length;

if (n % W != 0)
return false;

TreeMap<Integer, Integer> map = new TreeMap<>();

for (int h : hand)
map.put(h, map.getOrDefault(h, 0) + 1);

while (!map.isEmpty()) {
int firstNum = map.firstKey();

for (int i = firstNum; i < firstNum + W; i++) {
int count = map.getOrDefault(i, 0);

if (count < 1)
return false;
else if (count == 1)
map.remove(i);
else
map.replace(i, count - 1);
}
}

return true;
}