剑指 Offer 61. 扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0可以看成任意数字。A 不能视为 14。
由分析可知,五张牌中最大值为max,最小值为min,若可以组成顺子,则max-min < 5;其中 0 可以代替任何数字,所以
解法一:首先对数组进行排序,对零进行计数,判断需要多少个零可以构成顺子,若需要的零大于现有的,返回false,如果有元素相等,直接返回false。
例如
扑克牌: 0 2 5 6 7
我们发现 2 和 5 之间需要 5 - 2 - 1 张大王或小王来填补 但大王或小王只有 1张,所以它不可以构成顺子
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(),nums.end());
int count = 0;
for( int i = 0 ; i < 4;i++)
{
if( nums[i] == 0 )
{
count++;
continue;
}
if( nums[i] == nums[i+1]) return false;
count-=nums[i+1]-nums[i]-1;
}
return count >= 0;
}
};
解法二:利用集合set的自动排序和无重复值的特点。
class Solution {
public:
bool isStraight(vector<int>& nums) {
set<int>result;
for( int num: nums)
{
if( result.find(num) != result.end()) return 0;
if( num)
{
result.insert(num);
}
}
return *result.rbegin()-*result.begin() < 5;
}
};