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

35 阅读4分钟

问题理解

首先,我们需要理解题目中的几个关键点:

  1. 牌面值的定义:牌面值的大小规则为 A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为 1,K 为 13,依此类推。为了简化计算,我们可以将 A 的牌面值设为 14,这样在排序时 A 仍然是最大的。
  2. “葫芦”组合的定义:一个“葫芦”组合由三张相同牌面值的牌和两张相同牌面值的牌组成。我们需要找到符合条件的最大“葫芦”组合。
  3. 最大值限制:组合的牌面值之和不能超过给定的最大值 max

数据结构的选择

为了高效地解决这个问题,我们可以使用字典来统计每种牌面值的数量。字典的键是牌面值,值是该牌面值的数量。这样我们可以快速地查找和更新每种牌面值的数量。

算法步骤

  1. 统计牌面值的数量:遍历输入的牌组,统计每种牌面值的数量。如果遇到 A(牌面值为 1),我们将其转换为 14,以便在排序时 A 仍然是最大的。

  2. 排序牌面值:将统计后的牌面值按从大到小的顺序排序。这样我们可以从最大的牌面值开始,尝试找到符合条件的“葫芦”组合。

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

    • 遍历排序后的牌面值,尝试找到三张相同牌面值的牌。
    • 对于每个三张相同牌面值的牌,再遍历排序后的牌面值,尝试找到两张相同牌面值的牌。
    • 检查组合的牌面值之和是否不超过给定的最大值 max
    • 如果找到符合条件的组合,返回该组合的牌面值。
  4. 返回结果:如果没有找到符合条件的“葫芦”组合,返回 [0, 0]

代码详解

以下是实现上述算法的代码:

def solution(n, max, array):
    # 统计每种牌面值的数量
    count = {}
    for card in array:
        if card == 1:  # 将A的牌面值设为14
            card = 14
        if card in count:
            count[card] += 1
        else:
            count[card] = 1
    
    # 对牌面值进行排序,从大到小
    sorted_cards = sorted(count.keys(), reverse=True)
    
    # 遍历排序后的牌面值,尝试找到符合条件的“葫芦”组合
    for a in sorted_cards:
        if count[a] >= 3:
            for b in sorted_cards:
                if a != b and count[b] >= 2:
                    a1 = a
                    if a == 14:
                        a1 = 1
                    b1 = b
                    if b == 14:
                        b1 = 1
                    # 检查组合的牌面值之和是否不超过给定的最大值
                    if (3 * a1 + 2 * b1) <= max:
                        return [a1, b1]
    
    # 如果没有找到符合条件的“葫芦”组合,返回 [0, 0]
    return [0, 0]

if __name__ == "__main__":
    # Add your test cases here
    print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5])
    print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9])
    print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0])

代码分析

  1. 统计牌面值的数量

    • 我们使用字典 count 来统计每种牌面值的数量。如果遇到 A(牌面值为 1),我们将其转换为 14,以便在排序时 A 仍然是最大的。
  2. 排序牌面值

    • 使用 sorted(count.keys(), reverse=True) 对牌面值进行从大到小的排序。
  3. 查找符合条件的“葫芦”组合

    • 我们遍历排序后的牌面值,尝试找到三张相同牌面值的牌。
    • 对于每个三张相同牌面值的牌,再遍历排序后的牌面值,尝试找到两张相同牌面值的牌。
    • 检查组合的牌面值之和是否不超过给定的最大值 max
    • 如果找到符合条件的组合,返回该组合的牌面值。
  4. 返回结果

    • 如果没有找到符合条件的“葫芦”组合,返回 [0, 0]

个人思考与分析

在解决这个问题时,我们需要考虑如何高效地查找符合条件的“葫芦”组合。通过使用字典来统计牌面值的数量,我们可以快速地查找和更新每种牌面值的数量。排序牌面值后,我们可以从最大的牌面值开始,尝试找到符合条件的组合,这样可以确保我们找到的是最大的“葫芦”组合。

此外,我们还需要注意牌面值的转换问题。由于 A 的牌面值为 1,但在排序时我们需要将其视为最大的牌面值,因此我们将 A 的牌面值设为 14。在计算组合的牌面值之和时,我们需要将 A 的牌面值转换回 1。