剑指offer 69. 扑克牌的顺子

✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
📚专栏地址:剑指offer系列题解
📝原题地址:题目地址
📣专栏定位:为找工作的小伙伴整理常考算法题解,祝大家都能成功上岸!
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

题目描述

从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。

2∼10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,大小王可以看做任意数字。

为了方便,大小王均以 0 来表示,并且假设这副牌中大小王均有两张。

样例1
输入:[8,9,10,11,12]

输出:true
样例2
输入:[0,8,9,11,12]

输出:true

方法一:排序+遍历 O(n)=O(5)=O(1)

思路如下:

  1. 先排除容器为空的情况,然后将所有数进行排序。
  2. 去掉 0 ,从前找到第一个非 0 的数。
  3. 0 以外的数中不能出现重复的数字,不然不满足顺子要求。
  4. 最后再判断除 0 以外的数中的最大值和最小值之差是否等于 4 ,因为最多只有 5 张牌,如果差值超过 4 则无法用足够的 0 去填补(最多只有 40)。例如,差值为 5 ,那么非 0 的数占 2 个,即使剩下的 3 个数都为 0 ,但至少也需要 40 才能填补构成顺子。

注意: 题目假设大小王各有两张,故最多可能出现 40

class Solution {
public:
    bool isContinuous(vector<int> numbers) {
        if (numbers.empty()) return false;
        sort(numbers.begin(), numbers.end());

        //将0排除掉
        int k = 0;
        while (!numbers[k])  k++;

        //不能出现相等的数
        for (int i = k + 1; i < numbers.size(); i++)
            if (numbers[i] == numbers[i - 1])
                return false;

        //最大值与最小值之差必须在4以内
        return numbers.back() - numbers[k] <= 4;
    }
};

欢迎大家在评论区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值