846. Hand of Straights
Description
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/
Solutions
Solution: Greedy
- Time complexity: O(nlogn)
- Space complexity: O(n)
JavaScript
js
/**
* @param {number[]} hand
* @param {number} groupSize
* @return {boolean}
*/
const isNStraightHand = function (hand, groupSize) {
const n = hand.length;
if (n % groupSize) return false;
hand.sort((a, b) => a - b);
const cardMap = hand.reduce((map, card) => {
const count = map.get(card) ?? 0;
return map.set(card, count + 1);
}, new Map());
for (const [card, count] of cardMap) {
if (!count) continue;
for (let current = card + 1; current < card + groupSize; current++) {
const currentCount = cardMap.get(current) ?? 0;
if (currentCount < count) return false;
cardMap.set(current, currentCount - count);
}
}
return true;
};