分析
开始首先判断,如果hand数组大小不能整除W,说明不能均分成组,直接返回false。
之后对数组进行排序。并计算总的组数len。
设一个a[]记录该数组当前最大数,cnt[]记录当前数组大小。
之后对每一个元素能否放入当前组进行判断,若最终该元素无处安放,直接返回false。
C++ 代码
class Solution {
public:
bool isNStraightHand(vector<int>& hand, int W) {
int n=hand.size();
if(n%W!=0 || n<1) return false;
sort(hand.begin(),hand.end());
int len=n/W;
int a[len+1],cnt[len+1];
memset(a,-1,sizeof a);
memset(cnt,0,sizeof cnt);
for(int i=0;i<n;i++)
{
int idx=0,f=0;
while(idx<len)
{
if(a[idx]==-1) //当前数组为空,可以放
{
a[idx]=hand[i],cnt[idx]++;
f=1;
break;
}
else{
if(hand[i]-1==a[idx] && cnt[idx]<W) //可以形成连续数组且大小小于W,可以放
{
a[idx]=hand[i],cnt[idx]++;
f=1;
break;
}
}
idx++;
}
if(!f) return false; //无处安放,直接返回false
}
for(int i=0;i<len;i++)
{
if(cnt[i]!=W) return false; //该组没有连续W张牌,返回false
}
return true;
}
};
这篇博客介绍了一个C++解决方案,用于检查给定的扑克牌手牌(hand数组)是否能按W张一组连续排列。首先检查手牌数量能否被W整除,然后对牌进行排序,并通过遍历判断每个元素是否能放入当前组,如果无法形成连续序列则返回false。最后检查所有组是否都有连续W张牌,全部满足条件则返回true。
1011

被折叠的 条评论
为什么被折叠?



