剑指offer 面试题61 扑克牌中的顺子

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

思路1:排序

把数组排序,统计数组中0的个数,统计排序之后的数组中相邻数字之间的空缺总数。

如果空缺总数小于等于0的个数,则是顺子,否则不是。

另外,如果有对子出现,则不是顺子。

代码:

class Solution {
public:
    bool IsContinuous( vector<int>& numbers ) {
        if(numbers.empty())
            return false;
        sort(numbers.begin(),numbers.end());
        int numOf0=0;
        for(int i=0;i<4;++i)
        {
            if(numbers[i]==0)
            {
                numOf0++;
                continue;
            }
            if(numbers[i+1]==numbers[i])
                return false;
            numOf0-=numbers[i+1]-numbers[i]-1;
        }
        if(numOf0>=0)
            return true;
        else
            return false;
    }
};

复杂度分析:时间复杂度为O(1),空间复杂度为O(1).

思路2:不排序.

找到最大值和最小值(跳过0),如果最大值-最小值+1>5,则有0也不可能构成顺子,如果最大值-最小值+1<=5,则能构成顺子,0填在合适的位置即可。

此外,利用数组判断是否存在重复数字。

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        bool m[15];
        memset(m, 0, sizeof(m));
        int minValue = 14, maxValue = 0;
        for (int item : nums) {
            if (item == 0) {
                continue;
            }
            if (m[item]) {
                return false;
            }
            m[item] = true;
            minValue = min(minValue, item);
            maxValue = max(maxValue, item);            
        }
        return maxValue - minValue + 1 <= 5;
    }
};

复杂度分析:时间复杂度为O(1),空间复杂度为O(1).

发布了115 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_22148493/article/details/105313057
今日推荐