## [846\. Hand of Straights](https://leetcode.com/problems/hand-of-straights/) 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` ```cpp= class Solution { public: bool isNStraightHand(vector<int>& hand, int groupSize) { int n = hand.size(); if(n % groupSize) return false; // 使用 TreeMap 計算每個數字的頻率 // TreeMap 裡面的 key 會從小到大排列 map<int, int> freq; for(auto h : hand) ++freq[h]; while(!freq.empty()) { // TreeMap 的第一個數字,也就是陣列裡最小的數字 int first = freq.begin()->first; // 從 first 當作起始點,遞增到 < first + groupSize // 也就是遞增到每個 group 的最大值 for(int i = first; i < first + groupSize; ++i){ // 如果 i 不存在 freq 裡的話,代表這個數字已經被其他 group 用完了 if(!freq.count(i)) { return false; } // 如果 i 存在在 freq 裡的話,頻率減一 --freq[i]; // 頻率扣到為 0 的話,刪除這個 key if(freq[i] == 0) { freq.erase(i); } } } return true; } }; ``` :::success - 時間複雜度:$O(n \cdot \log n)$ - 空間複雜度:$O(n)$ :::