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 的长度,主要为哈希表的存储开销。

你可能感兴趣的:(力扣,leetcode,算法)