①问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌aa和另外两张相同牌面值的牌bb。如果两个人同时拥有“葫芦”,我们会优先比较牌aa的大小,若牌aa相同则再比较牌 bb 的大小。 在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
②思路想法
解题分析
规则描述
-
组成“葫芦”的牌型为:
- 三张相同牌面值的牌a。
- 两张相同牌面值的牌b。
-
五张牌牌面值之和不能超过最大值max。
-
比较规则:
- 先比较a的大小,a大的“葫芦”更优。
- 若a相同,则比较b的大小,b大的“葫芦”更优。
输入
- 一个整数数组P,表示每种牌的张数(从2到A)。
- 一个整数max,表示牌面值之和的最大限制。
输出
- 找到的“葫芦”中a和b的值。
- 如果无法组成符合条件的“葫芦”,输出 "0, 0"。
解题思路
-
遍历所有可能的组合:
- 枚举所有牌值作为a。
- 对每个a,枚举剩下的牌值作为b。
-
检查条件:
-
组成“葫芦”的五张牌数量是否满足:
- 至少有三张a。
- 至少有两张b。
-
牌面值之和是否不超过max。
-
-
更新结果:
- 比较当前组合是否优于已有结果(优先比较a,其次比较b)。
主要代码如下:
# 统计每种牌面值的出现次数
count = defaultdict(int)
for card in array:
adjusted_card = card if card != 1 else 14
count[adjusted_card] += 1
# 寻找符合条件的“葫芦”
num3 = 0
num2 = 0
current_sum = 0
for key, value in count.items():
if value >= 3:
for other_key, other_value in count.items():
if other_key != key and other_value >= 2:
sum_value = calculate_sum(key if key != 14 else 1, other_key if other_key != 14 else 1)
if sum_value <= max:
if key > num3 or (key == num3 and other_key > num2):
num3 = key
num2 = other_key
current_sum = sum_value
# 返回结果
if current_sum > 0:
return [num3 if num3 != 14 else 1, num2 if num2 != 14 else 1]
else:
return [0, 0]
def calculate_sum(num1, num2):
return num1 * 3 + num2 * 2
③总结分析
时间复杂度
外层和内层循环嵌套,复杂度为O(M^2),其中M是牌面值的种类数。
空间复杂度
空间复杂度取决于使用的辅助存储结构:
- 字典
count:用来统计牌面值的频率,最多存储M个键值对。 - 临时变量:包括
best_a,best_b,total等变量,空间需求为O(1)。
因此,空间复杂度为:O(M)