描述
从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
- A为1,J为11,Q为12,K为13,A不能视为14
- 大、小王为 0,0可以看作任意牌
- 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
4.数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
输入:[6,0,2,0,4]
返回值:true
说明:
中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true
要求:空间复杂度 O(1),时间复杂度 O(nlogn),本题也有时间复杂度 O(n)的解法
解题思路
顺子牌的特点:
1、顺子一定没有相等的牌;
2、顺子中两张相邻的扑克牌的数值差为1,即满足interrapt=numbers[i + 1] - numbers[i] - 10;
3、当interrapt不为0,代表需要在顺子中插入对应interrapt张牌;
4、只有两张王牌;
主要思路:
1、排序五张牌;
2、遍历5张牌,并求出大小王的数量zero_num,与interrapt的大小;
3、判断interrapt的大小。
(1)interrapt0,除大小王之外的牌本来就是顺子,大小王随便补齐在头部或者尾部;
(2)interrapt<=zero_num,除大小王之外的牌不是顺子,可以通过大小王变成特定的牌补在其中,使其成为顺子;
(2)interrapt>zero_num,除大小王之外的牌不是顺子,即使有大小王也补不成顺子。
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
sort(numbers.begin(),numbers.end());
int i=0,zero_num=0;
while(numbers[i]==0) zero_num++,i++;
int interrapt=0;
for (;i<numbers.size()-1;i++){//从不是0的牌开始
if(numbers[i+1]==numbers[i]) return false;
interrapt += numbers[i+1]-numbers[i]-1;//计算距离
}
if(zero_num>=interrapt) return true;
return false;
}
};