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

81 阅读5分钟

寻找最大葫芦

问题描述

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

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max。牌面值的大小规则为: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]

题目分析

给定一个数组 array,需要找出两个不同的数字,一个至少出现三次,另一个至少出现两次,并且这五张牌的总和不能超过给定的最大值 max。如果找到符合条件的组合,返回这两个数字的索引;否则返回 [0, 0]

解题思路

  1. 统计频率

    • 使用一个长度为14的数组 count 来记录每个数字(0到13)在 array 中出现的次数。
  2. 优先处理特殊情况

    • 首先检查数字1是否可以作为至少出现三次的数字。如果可以,则寻找另一个至少出现两次的数字,并检查它们的组合和是否符合要求。
  3. 查找组合

    • 从高到低遍历,寻找第一个至少出现三次的数字。
    • 对于找到的第一个数字,再次从高到低遍历寻找一个不同的且至少出现两次的数字。
    • 特别处理:如果数字1至少出现两次,并且不是第一个数字,则优先考虑。
  4. 返回结果

    • 如果找到符合条件的组合,返回这两个数字的索引;否则返回 [0, 0]

在这道题目中,我们需要寻找符合条件的最大“葫芦”组合。这个组合由五张牌组成,其中三张牌面值相同,称为 a,另外两张牌面值相同,称为 b。同时,五张牌的总和不能超过给定的最大值 max。如果找到符合条件的组合,输出 ab;否则,输出 [0, 0]

解题思路

  1. 统计频率

    • 使用一个数组 count 来记录每个牌面值在输入数组 array 中出现的次数。数组长度为14,因为牌面值从1到13(A到K)。
  2. 优先处理特殊情况

    • 特别处理 A(牌面值为1),因为 A 是最大的牌面值。如果 A 可以作为三张相同的牌,我们优先考虑这种情况。
  3. 查找组合

    • 从高到低遍历,寻找第一个至少出现三次的牌面值 a
    • 对于找到的 a,再次从高到低遍历寻找一个至少出现两次的不同牌面值 b
    • 特别处理:如果 A 可以作为 b,优先考虑。
  4. 计算和验证

    • 检查找到的 ab 组合的牌面值之和是否小于或等于 max
    • 如果满足条件,返回 [a, b];否则,继续寻找。
  5. 返回结果

    • 如果遍历结束后没有找到符合条件的组合,返回 [0, 0]

示例分析

示例 1

  • 输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]
  • 处理:8可以作为 a,5可以作为 b,组合为 [8, 5],总和为 (3 \times 8 + 2 \times 5 = 34),符合条件。

示例 2

  • 输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13]
  • 处理:6可以作为 a,9可以作为 b,组合为 [6, 9],总和为 (3 \times 6 + 2 \times 9 = 36),符合条件。

示例 3

  • 输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6]
  • 处理:没有符合条件的组合,返回 [0, 0]

复杂度分析

  • 时间复杂度:(O(n + m^2)),其中 (n) 是数组的长度,(m) 是牌面值的范围(14)。
  • 空间复杂度:(O(m)),用于存储牌面值的频率。

通过这种方法,我们可以有效地找到符合条件的最大“葫芦”组合,并确保计算的准确性和效率。

代码实现

def solution(n, max, array):
    # 创建一个计数数组来存储0到13的数字出现的频率
    count = [0] * 14
    
    # 统计每个数字在数组中的出现次数
    for num in array:
        count[num] += 1
    
    # 初始化标志和索引
    first_index = -1
    second_index = -1
    
    # 特殊处理数字1
    if count[1] >= 3:
        first_index = 1
        for j in range(13, -1, -1):
            if count[j] >= 2 and j != first_index:
                if 3 * first_index + 2 * j <= max:
                    second_index = j
                    return [first_index, second_index]
    
    # 从高到低找到第一个出现至少3次的数字
    for i in range(13, -1, -1):
        if count[i] >= 3 and first_index != 0:
            first_index = i
            if count[1] >= 2 and first_index != 1:
                second_index = 1
                if 3 * first_index + 2 * second_index <= max:
                    return [first_index, second_index]
            for j in range(13, -1, -1):
                if count[j] >= 2 and j != first_index:
                    if 3 * first_index + 2 * j <= max:
                        second_index = j
                        return [first_index, second_index]
            first_index = -1
    
    return [0, 0]

if __name__ == "__main__":
    # 测试用例
    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])