题意:
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
方法:
计数排序
思路:依据题意,0可以看做任意数,(即免死金牌),因此要统计0的个数。
首先,遍历一遍数组,统计0的个数和寻找除0外的最小值,并判断某值是否存在;vis[numbers[i]]=1;//判断值是否存在最后,从除0外的最小值开始遍历5个连续数,判断是否组成顺子。0可以看做任意数,因此当缺少某值时可以用0代替。如果某值不存在且0的个数用完了,则返回false;否则,返回true。
class Solution {
public:
int vis[15]={0};
bool IsContinuous( vector<int> numbers ) {
int n=numbers.size();
int cnt=0;//统计0的个数
int mi=15;//寻找除0外的最小值
for(int i=0;i<n;i++){
if(numbers[i]==0){
cnt++;
}else{
vis[numbers[i]]=1;//判断值是否存在
mi=min(mi,numbers[i]);
}
}
for(int i=mi;i<mi+5;i++){//从除0外的最小值开始遍历5个连续数,判断是否组成顺子
if(vis[i]==0){//如果某值不存在且0的个数用完了,则返回false
if(cnt==0){
return false;
}
cnt--;
}
}
return true;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号