题意:
现在有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; } };
时间复杂度:空间复杂度: