5. 寻找最大葫芦 | 豆包MarsCode AI刷题

66 阅读4分钟

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。

给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。


测试样例

样例1:

输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
输出:[8, 5]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
输出:[6, 9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
输出:[0, 0]

问题理解

我们需要在给定的牌组中找到一个符合条件的“葫芦”组合,即三张相同牌面值的牌和两张相同牌面值的牌,并且这些牌的面值之和不能超过给定的最大值 max_sum。如果存在多个符合条件的“葫芦”,我们需要选择其中牌面值最大的组合。

数据结构选择

  1. 牌面值映射:我们使用一个字典 card_value 来映射牌面值,其中 A 的牌面值为 14,K 为 13,依此类推。
  2. 牌面值计数:我们使用 defaultdict 来统计每种牌面值的出现次数。

算法步骤

  1. 初始化牌面值映射:将 A 映射为 14,其他牌面值保持不变。

  2. 统计牌面值出现次数:遍历输入的牌组,统计每种牌面值的出现次数。

  3. 寻找符合条件的“葫芦”

    • 遍历每种牌面值,如果该牌面值出现次数大于等于 3,则继续寻找另一种牌面值,其出现次数大于等于 2。
    • 计算这两种牌面值的组合是否满足总和不超过 max_sum 的条件。
    • 如果满足条件,则更新当前找到的最大“葫芦”组合。
  4. 返回结果:如果找到符合条件的“葫芦”,则返回其牌面值;否则返回 [0, 0]

代码解释

  1. 牌面值映射card_value 字典用于将 A 映射为 14,其他牌面值保持不变。

  2. 统计牌面值出现次数count 字典用于统计每种牌面值的出现次数。

  3. 寻找符合条件的“葫芦”

    • 遍历 count 字典,找到出现次数大于等于 3 的牌面值。
    • 对于每个符合条件的牌面值,再遍历 count 字典,找到另一个出现次数大于等于 2 的牌面值。
    • 计算这两种牌面值的组合是否满足总和不超过 max_sum 的条件。
    • 如果满足条件,则更新当前找到的最大“葫芦”组合。
  4. 返回结果:如果找到符合条件的“葫芦”,则返回其牌面值;否则返回 [0, 0]

通过这种方式,我们可以有效地找到符合条件的最大“葫芦”组合。

python题解

from collections import defaultdict
 
def solution(n, max_sum, array):
    # 牌面值的映射
    card_value = {
        1: 14,  # A
        13: 13, # K
        12: 12, # Q
        11: 11, # J
        10: 10, # 10
        9: 9,   # 9
        8: 8,   # 8
        7: 7,   # 7
        6: 6,   # 6
        5: 5,   # 5
        4: 4,   # 4
        3: 3,   # 3
        2: 2    # 2
    }
 
    # 统计每种牌面值的出现次数
    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_sum:
                        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
 
# 测试用例
result1 = solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1])
print(result1 == [8, 5])
 
result2 = solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13])
print(result2 == [6, 9])
 
result3 = solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6])
print(result3 == [0, 0])