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

50 阅读4分钟

寻找最大葫芦 题解

问题描述

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

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

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

思路解析

  1. 牌面值映射: 首先需要理解牌面值的映射关系,这个很简单。A的值是1,K的值是13,Q是12,J是11,依此类推。
  2. 统计每张牌的数量: 我们可以使用Counter来统计给定牌组中每个牌面值的出现次数。Counter会帮助我们快速确定哪些牌面值有足够的数量来组成“葫芦”(至少有三张相同牌组成a,至少有两张相同牌组成b)。
  3. 枚举所有可能的“葫芦”组合: 对于每个满足条件的a,我们尝试找出不同的b,并计算它们的总牌面值之和。如果该和不超过max_sum,则该组合是一个合法的“葫芦”。
  4. 选择最大的“葫芦” : 在所有合法的“葫芦”组合中,我们要选择一个最大组合。我们通过比较a的大小来排序,如果a相同,再比较b的大小。
  5. 返回结果: 如果找到了合法的“葫芦”组合,则返回ab;如果没有找到,返回“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]))  

实际解题思路详解

  1. 映射牌面值: 由于A的牌面值为1不符合题目要求,因此将其定义为14,我们为牌面值1定义一个特殊处理函数card_value(val)。这样我们就能确保A比K大,符合题目要求。
  2. 统计牌的数量: 我们使用Counter来统计给定牌组中每个牌面值的出现次数。Counter返回的是一个字典,键为牌面值,值为该牌面值的出现次数。
  3. 枚举组合: 我们首先找到所有出现次数大于或等于3的牌面值a,然后对于每个a,再寻找所有出现次数大于或等于2的牌面值b。注意a和b不能相同。
  4. 计算总和: 对于每个合法的组合,计算其总和3 * a + 2 * b,如果总和小于等于max_sum,则该组合符合要求。
  5. 排序与选择: 我们将所有合法的“葫芦”组合存入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