【剑指Offer-61】扑克牌中的顺子

问题

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

示例

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

解答1:找充要条件

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        set<int> s;
        for (int i : nums) {
            if (s.find(i) != s.end()) return 0; // 有重复就不行
            if (i) s.insert(i);
        }
        return *s.rbegin() - *s.begin() < 5; // set的最右子节点是最大值,左是最小值
    }
};

重点思路

如果能得到以下结论那这道题迎刃而解:是不是顺子的充要条件是除了0以外没有重复,并且除了0以外最大最小值之差小于5。

解答2:用0填坑

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int cnt = 0, i = 0;
        while (nums[i] == 0) {
            i++;
            cnt++;
        } // 找0的个数
        for (; i < nums.size() - 1; i++) {
            if (nums[i + 1] == nums[i]) return 0; // 重复则不行
            cnt -= nums[i + 1] - nums[i] - 1;
            if (cnt < 0) return 0; // 不够填坑也不行
        }
        return 1;
    }
};
posted @ 2021-03-06 20:47  tmpUser  阅读(55)  评论(0编辑  收藏  举报