寻找最大葫芦 题解
问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌a和另外两张相同牌面值的牌b。如果两个人同时拥有“葫芦”,我们会优先比较牌a的大小,若牌a相同则再比较牌b的大小。
在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。
给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。
思路解析
- 牌面值映射: 首先需要理解牌面值的映射关系,这个很简单。A的值是
1,K的值是13,Q是12,J是11,依此类推。 - 统计每张牌的数量: 我们可以使用
Counter来统计给定牌组中每个牌面值的出现次数。Counter会帮助我们快速确定哪些牌面值有足够的数量来组成“葫芦”(至少有三张相同牌组成a,至少有两张相同牌组成b)。 - 枚举所有可能的“葫芦”组合: 对于每个满足条件的a,我们尝试找出不同的b,并计算它们的总牌面值之和。如果该和不超过
max_sum,则该组合是一个合法的“葫芦”。 - 选择最大的“葫芦” : 在所有合法的“葫芦”组合中,我们要选择一个最大组合。我们通过比较a的大小来排序,如果a相同,再比较b的大小。
- 返回结果: 如果找到了合法的“葫芦”组合,则返回
a和b;如果没有找到,返回“0, 0”。
解题代码
from collections import Counter
def solution(n, max_sum, array):
def card_value(val):
return 14 if val == 1 else val
count = Counter(array)
possible_full_houses = []
# 枚举所有可能
for a_val, a_count in count.items():
if a_count >= 3:
for b_val, b_count in count.items():
if b_val != a_val and b_count >= 2:
total_sum = 3 * a_val + 2 * b_val
if total_sum <= max_sum:
possible_full_houses.append((a_val, b_val))
if not possible_full_houses:
return [0, 0]
possible_full_houses.sort(key=lambda x: (card_value(x[0]), card_value(x[1])), reverse=True)
return list(possible_full_houses[0])
if __name__ == "__main__":
# Add your test cases here
print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]))
print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]))
print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]))
实际解题思路详解
- 映射牌面值: 由于A的牌面值为1不符合题目要求,因此将其定义为14,我们为牌面值1定义一个特殊处理函数
card_value(val)。这样我们就能确保A比K大,符合题目要求。 - 统计牌的数量: 我们使用
Counter来统计给定牌组中每个牌面值的出现次数。Counter返回的是一个字典,键为牌面值,值为该牌面值的出现次数。 - 枚举组合: 我们首先找到所有出现次数大于或等于3的牌面值a,然后对于每个a,再寻找所有出现次数大于或等于2的牌面值b。注意a和b不能相同。
- 计算总和: 对于每个合法的组合,计算其总和
3 * a + 2 * b,如果总和小于等于max_sum,则该组合符合要求。 - 排序与选择: 我们将所有合法的“葫芦”组合存入
possible_full_houses列表,然后按a和b的大小排序,返回最优的组合。如果没有合法的组合,返回[0, 0]。
复杂度分析
- 时间复杂度:
统计每个牌面值的数量需要O(n),其中n是牌的数量。接着,我们需要枚举所有可能的a和b组合。每个a最多有O(n)种可能的b,因此总的时间复杂度为O(n^2),其中n是牌的数量。 - 空间复杂度:
我们使用Counter来存储牌面值的出现次数,因此空间复杂度为O(n),其中n是牌的数量。possible_full_houses的大小最多为O(n^2),因此空间复杂度是O(n^2)。
感受与注意事项
- 输入数据的大小: 在这个问题里A要比K大,因此输入数据
1要比13大,将其定义为14。