Hand of Straights 一手顺子
程序员文章站
2022-01-15 11:59:28
...
爱丽丝有一手(hand
)由整数数组给定的牌。
现在她想把牌重新排列成组,使得每个组的大小都是 W
,且由 W
张连续的牌组成。
如果她可以完成分组就返回 true
,否则返回 false
。
示例 1:
输入:hand = [1,2,3,6,2,3,4,7,8], W = 3
输出:true
解释:爱丽丝的手牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。
示例 2:
输入:hand = [1,2,3,4,5], W = 4 输出:false 解释:爱丽丝的手牌无法被重新排列成几个大小为 4 的组。
提示:
1 <= hand.length <= 10000
0 <= hand[i] <= 10^9
1 <= W <= hand.length
思路:直接用map可以做(因为map内部是红黑树,对于key是自动由小到大排序的),首先对给定的数组放入map<value,value of times>,然后每次从中取出W个比较,如果刚好是W个连续的数字,那么我们一直操作到map为空,只要有一个不连续就返回false。这里要注意的是,我们需要把对应的map的key为0的value及时删除。
参考代码:
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int W) {
if ((hand.size() % W) != 0) return false;
map<int,int> m;
for (int i = 0; i < hand.size(); i++) m[hand[i]]++;
int w_length = W;
while (!m.empty()) {
int head = -1;
for (int i = 0; i < w_length;i++) {
if (i == 0) {
head = m.begin()->first;
m.begin()->second--;
if (m[head] == 0) m.erase(head);
continue;
}
if (m[head+1]==0) return false;
head++;
m[head]--;
if (m[head] == 0) m.erase(head);
}
}
return m.empty();
}
};