剑指offer 69. 扑克牌的顺子

简介: 剑指offer 69. 扑克牌的顺子

题目描述

扑克牌中随机抽 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 去填补(最多只有 4 个 0)。例如,差值为 5 ,那么非 0 的数占 2 个,即使剩下的 3 个数都为 0 ,但至少也需要 4 个 0 才能填补构成顺子。


注意: 题目假设大小王各有两张,故最多可能出现 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;
    }
};


欢迎大家在评论区交流~

目录
相关文章
【剑指offer】-跳台阶-08/67
【剑指offer】-跳台阶-08/67
【剑指offer】-扑克牌顺子-44/67
【剑指offer】-扑克牌顺子-44/67
|
8月前
|
机器学习/深度学习 算法 C++
剑指offer(C++)-JZ61:扑克牌顺子(算法-模拟)
剑指offer(C++)-JZ61:扑克牌顺子(算法-模拟)
|
9月前
[CQOI 2010]扑克牌
[CQOI 2010]扑克牌
图解LeetCode——面试题61. 扑克牌中的顺子
图解LeetCode——面试题61. 扑克牌中的顺子
79 1
蓝桥杯:二分法求分巧克力
蓝桥杯:二分法求分巧克力
51 0
|
uml
牛客 小乐乐学数学(扫描线+树状数组)
牛客 小乐乐学数学(扫描线+树状数组)
81 0
LeetCode每日一题——324. 摆动排序 II
给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
69 0
|
算法
每日算法刷题Day12-跳台阶、排列、替换空格、求n累加
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。
78 0
每日算法刷题Day12-跳台阶、排列、替换空格、求n累加