一、题目
给你一个整数数组 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 的长度,主要为哈希表的存储开销。