跳转至

面试题61. 扑克牌中的顺子

Tags: Easy Array

Links: https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/


从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:

输入: [1,2,3,4,5]
输出: True

示例 2:

输入: [0,0,1,2,5]
输出: True

限制:

数组长度为 5

数组的数取值为 [0, 13] .


class Solution {
public:
    bool isStraight(vector<int>& nums) {
        std::ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);

        int n = nums.size();
        vector<bool> used(14, false);
        int maxValue = 1, minValue = 14;
        for (auto e : nums) {
            if (e == 0) continue;
            if (used[e]) return false;
            used[e] = true;
            maxValue = max(e, maxValue);
            minValue = min(e, minValue);
        }

        return maxValue - minValue + 1 <= 5;
    }
};
执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗 :10.2 MB, 在所有 C++ 提交中击败了100.00%的用户

不妨先思考一个这样的问题: 有一串连续的数字(无重复),这串数字中最大值为 m, 最小值为 n ,问你这串数字中一共有多少个数字?

答案:m - n + 1

同样,如果我们能够知道 5 张扑克牌中的最大值 maxValue 和最小值 minValue,那我们就知道,要使它为顺子需要 maxValue - minValue + 1 张牌。

在查找 maxValue 和 minValue 过程中,跳过大小王 0 。 如果 maxValue - minValue + 1 > 5,说明题目给的 5 张牌不足以构成顺子,返回 false . 即使里面有大小王,也不够用来填补使它构成顺子。 如果 maxValue - minValue + 1 <= 5,说明 5 张牌足以构成顺子,返回 true。 里面的大小王填补在合适位置即可。 同时,我们再定义一个标志数组判断是否有重复数字,发现重复数字直接返回 false 即可。