剑指 Offer 61. 扑克牌中的顺子

剑指 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Did然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值