爱丽丝有一手(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
解题思路
- 首先判断一些临界条件:数组大小为0,数组大小不能整除W,数组大小小于W,以上三个条件只要一个成立 ,则返回 false;判断 W为1,如果是,返回true。
- 正常情况下,对原数组进行排序与否不影响结果(都能调试通过)。利用map<int, int>的键和值分别对应原始的值和值的重复个数,然后遍历map,只要某个键对应的值小于0,则返回false。
C++代码
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int W) {
if(hand.size() == 0 || (hand.size() % W) != 0 || hand.size() < W)
return false;
if(W == 1)
return true;
//sort(hand.begin(), hand.end());
map<int, int> m;
for(int i = 0; i < hand.size(); i++) {
m[hand[i]]++;
}
map<int, int>::iterator it;
for(it = m.begin(); it != m.end(); it++) {
int count = it->second;
if(count > 0) {
for(int i = 0; i < W; i++) {
m[it->first + i] -= count;
if(m[it->first + i] < 0) {
return false;
}
}
}
}
return true;
}
};