AI 刷题 5 | 豆包MarsCode AI刷题

83 阅读3分钟

①问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌aa和另外两张相同牌面值的牌bb。如果两个人同时拥有“葫芦”,我们会优先比较牌aa的大小,若牌aa相同则再比较牌 bb 的大小。 在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。

思路想法

解题分析

规则描述

  1. 组成“葫芦”的牌型为:

    • 三张相同牌面值的牌a。
    • 两张相同牌面值的牌b。
  2. 五张牌牌面值之和不能超过最大值max。

  3. 比较规则:

    • 先比较a的大小,a大的“葫芦”更优。
    • 若a相同,则比较b的大小,b大的“葫芦”更优。

输入

  • 一个整数数组P,表示每种牌的张数(从2到A)。
  • 一个整数max,表示牌面值之和的最大限制。

输出

  • 找到的“葫芦”中a和b的值。
  • 如果无法组成符合条件的“葫芦”,输出 "0, 0"。

解题思路

  1. 遍历所有可能的组合:

    • 枚举所有牌值作为a。
    • 对每个a,枚举剩下的牌值作为b。
  2. 检查条件:

    • 组成“葫芦”的五张牌数量是否满足:

      • 至少有三张a。
      • 至少有两张b。
    • 牌面值之和是否不超过max。

  3. 更新结果:

    • 比较当前组合是否优于已有结果(优先比较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)