zoukankan      html  css  js  c++  java
  • 【剑指Offer】面试题61. 扑克牌中的顺子

    题目

    从扑克牌中随机抽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].

    思路

    1. 先统计元素0的个数为zero
    2. 对数组排序
    3. 然后从倒数第二个数判断与最后一个数差值,如果不满足要求,则递减zero个数,如果zero小于0,则直接返回false,否则判断下一个数并递增判断次数和差值。

    代码

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            int zero = 0;
            for (int n : nums) {
                if (n == 0) ++zero;
            }
            sort(nums.begin(), nums.end());
            int i = 3, j = 1, c = 0; //j 表示差值,c表示判断次数
            while (c < 4) {
                if (nums[i] != nums[4] - j) {
                    --zero;
                    if (zero < 0) return false;
                } else {
                    --i;
                }
                ++c;
                ++j;
            }       
            return true;
        }
    };
    

    优化代码

    先排序,然后每次判断相邻两数差值,如果差值大于1,则表示两数之间需要 差值-1 个0来代替。

    时间复杂度:O(n)
    空间复杂度:O(1)

    class Solution {
    public:
        bool isStraight(vector<int>& nums) {
            int zero = 0;
            sort(nums.begin(), nums.end());
            for (int i = 0; i < 4; ++i) {
                if (nums[i] == 0) {
                    ++zero;
                    continue;
                }
                if (nums[i] == nums[i + 1]) return false;
                zero -= nums[i + 1] - nums[i] - 1;
            }
            return zero >= 0;
        }
    };
    
  • 相关阅读:
    数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
    Windows:任务调度器
    Package设计2:增量更新
    SSIS 数据流优化
    Data Profiling Task
    SSIS 表达式、操作符和函数
    SSIS 数据流的错误输出
    SSIS 控制流和数据流
    SET QUOTED_IDENTIFIER选项对索引的影响
    Security2:角色和权限
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12688431.html
Copyright © 2011-2022 走看看