寻找最大葫芦
问题描述
在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 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]
。
解题思路
-
统计频率:
- 使用一个长度为14的数组
count
来记录每个数字(0到13)在array
中出现的次数。
- 使用一个长度为14的数组
-
优先处理特殊情况:
- 首先检查数字1是否可以作为至少出现三次的数字。如果可以,则寻找另一个至少出现两次的数字,并检查它们的组合和是否符合要求。
-
查找组合:
- 从高到低遍历,寻找第一个至少出现三次的数字。
- 对于找到的第一个数字,再次从高到低遍历寻找一个不同的且至少出现两次的数字。
- 特别处理:如果数字1至少出现两次,并且不是第一个数字,则优先考虑。
-
返回结果:
- 如果找到符合条件的组合,返回这两个数字的索引;否则返回
[0, 0]
。
- 如果找到符合条件的组合,返回这两个数字的索引;否则返回
代码实现
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])
复杂度分析
- 时间复杂度:(O(n + m^2)),其中 (n) 是数组的长度,(m) 是数字的范围(14)。
- 空间复杂度:(O(m)),用于存储数字出现的频率。