扑克牌顺子
1.题目描述
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
示例 2:
2.方法1(排序)
排序之后扑克牌就有序了,我们就可以直接判断相邻两张牌之间需要多少个大王或小王来填补。
(1)如果需要填补大小王的数量,大于已有大小王的数量,则返回 false。
(2)相反,如果需要填补大小王的数量,小于或等于已有大小王的数量,则返回 true。
(2)如果排序之后有重复值,直接返回false。
3.代码
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(),nums.end());
int zero = 0;
for(int i = 0;i < 4;++i){
if(nums[i] == 0){
zero++;
continue;
}
if(nums[i] == nums[i+1]){
return false;
}
zero -= nums[i+1] - nums[i] - 1;
}
return zero >= 0;
}
};
4.复杂度分析
时间复杂度:O(nlogn)
空间复杂度:O(1)
5.方法2
求出除0以外的最大值、最小值,如果最大值-最小值+1 <= 5,则返回true,否则返回false。
6.代码
class Solution {
public:
bool isStraight(vector<int>& nums) {
vector<bool> m(15,false);
int min_value = 14,max_value = 0;
for(auto &num : nums){
if(num == 0){
continue;
}
if(m[num]){
return false;//有重复的牌
}
m[num] = true;
min_value = min(min_value,num);
max_value = max(max_value,num);
}
return max_value - min_value + 1 <= 5;
}
};
7.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)