描述
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
要求:空间复杂度 O(1)O(1),时间复杂度 O(nlogn)O(nlogn),本题也有时间复杂度 O(n)O(n) 的解法
输入描述:
输入五张扑克牌的值
返回值描述:
五张扑克牌能否组成顺子。
示例1
输入:
[6,0,2,0,4]
复制返回值:
true
复制说明:
中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4] 这样这五张牌在[2,6]区间连续,输出true
示例2
输入:
[0,3,2,6,4]
复制返回值:
true
思路:
1.对5张牌排序
2.统计大小王数量
3.统计正常牌的间隔 data[i-1]-data[i]-1 ,顺子的间隔为1,所以需要再减1就是需要王的数量
4.如果王的数量大于等于需要的数量,就能形成顺子
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
sort(numbers.begin(), numbers.end());
//统计大小王数量
int cnt=0;
int i=0;
int needsize=0;
while(numbers[i]==0) cnt++,i++;
//统计间隔数量
for(;i<numbers.size()-1;i++){
if(numbers[i]==numbers[i+1])return false;
needsize += numbers[i+1]-numbers[i]-1;
}
if(needsize<=cnt)return true;
return false;
}
};