LeetCode——2347. 最好的扑克手牌

一、题目

给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌,第 i 张牌大小为 ranks[i] ,花色为 suits[i] 。

下述是从好到坏你可能持有的 手牌类型 :

“Flush”:同花,五张相同花色的扑克牌。
“Three of a Kind”:三条,有 3 张大小相同的扑克牌。
“Pair”:对子,两张大小一样的扑克牌。
“High Card”:高牌,五张大小互不相同的扑克牌。
请你返回一个字符串,表示给定的 5 张牌中,你能组成的 最好手牌类型 。

注意:返回的字符串 大小写 需与题目描述相同。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/best-poker-hand/description/

二、C++解法

我的思路及代码

哈希表计数的方法,点数出现一下计数一次,当哈希表大小为 5 的时候说明 5 个点数都不一样,为 4 的时候说明有且仅有对子,为 2 和 1 的时候说明有 3 条。只有当哈希表的数量为 3 的时候,有可能是对子有可能是 3 条,所以我们做一次特殊处理即可。

class Solution {
public:
    string bestHand(vector<int>& ranks, vector<char>& suits) {
        if(suits[1]==suits[0]&&suits[2] == suits[0]&&suits[3] == suits[0]&&suits[4]==suits[0])
        return "Flush";
        unordered_map<int,int> map;

        for(int i=0;i<5;i++)
            map[ranks[i]]++;
        
        switch(map.size()){
            case 5:return  "High Card";
            case 1:return  "Three of a Kind";
            case 2:return  "Three of a Kind";
            case 3:
                for(int i=0;i<5;i++){
                    if(map[ranks[i]]>2)
                    return  "Three of a Kind";
                }
            default:return "Pair"; 
        }
    }
};
  • 时间复杂度:O(n),其中 n 为数组 ranks 的长度
  • 空间复杂度:O(n),其中 n 为数组 ranks 的长度,主要为哈希表的存储开销。

官方参考代码

思路和我差不多的,随便看看就好

class Solution {
public:
    string bestHand(vector<int>& ranks, vector<char>& suits) {
        unordered_set<char> suitsSet;
        for (char suit : suits) {
            suitsSet.emplace(suit);
        }
        if (suitsSet.size() == 1) {
            return "Flush";
        }
        unordered_map<int, int> h;
        for (int rank : ranks) {
            h[rank]++;
        }
        if (h.size() == 5) {
            return "High Card";
        }
        for (auto [_, val] : h) {
            if (val > 2) {
                return "Three of a Kind";
            }
        }
        return "Pair";
    }
};
  • 时间复杂度:O(n),其中 n 为数组 ranks 的长度
  • 空间复杂度:O(n),其中 n 为数组 ranks 的长度,主要为哈希表的存储开销。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地神仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值