寻找最大葫芦
题目分析
我们需要找到一组牌中符合“葫芦”规则的最大组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这五张牌的牌面值之和不能超过给定的最大值 max。
算法步骤
-
统计每种牌面值的数量:遍历输入的牌数组,使用
Map<Integer, Integer>统计每种牌面值的数量。 -
找到所有可能的“葫芦”组合:
- 遍历
countMap,将数量大于等于3的牌面值加入possibleTriplets列表。 - 将数量大于等于2的牌面值加入
possiblePairs列表。
- 遍历
-
选择符合条件的最大“葫芦”组合:
- 遍历
possibleTriplets和possiblePairs,计算每种组合的牌面值之和。 - 如果组合的牌面值之和不超过
max,则比较当前组合与已知最大组合的大小。 - 更新最大组合。
- 遍历
-
返回结果:如果找到符合条件的“葫芦”组合,返回该组合;否则返回
[0, 0]。
代码+分析
1. 统计每种牌的数量
这段代码的作用是统计数组中每种牌的出现次数。
countMap 是一个映射,其中 key 是牌面值,value 是对应的牌面值的出现次数。
2. 找出所有可能的三张相同牌(Triplets)和两张相同牌(Pairs)
根据牌面值的出现次数,将满足以下条件的牌加入对应的列表:
- 如果某种牌出现次数大于等于3,则将其作为三张相同的牌(Triplet)加入
possibleTriplets列表。 - 如果某种牌出现次数大于等于2,则将其作为两张相同的牌(Pair)加入
possiblePairs列表。
3. 遍历所有三张相同牌和两张相同牌,找到符合条件的最大葫芦组合
这段代码遍历所有的三张相同牌和两张相同牌,试图找到符合条件的最大葫芦组合:
- 只有当三张牌和两张牌的牌面值不相同(
triplet[0] != pair[0])时,才认为这是一种有效的组合。 - 如果该组合的总和(
sum = triplet[0] * 3 + pair[0] * 2)不超过最大值max,则尝试更新最大葫芦组合。 - 使用
compareCards函数来比较当前的组合是否比已有的最大组合更大。这个比较是先比较三张牌的牌面值,如果三张牌相同,则比较两张牌的牌面值。
4. 比较两张牌的大小
这个方法用来比较两张牌的大小,具体规则是:A (1) 被认为是最大的牌,值为14,其它牌的值按顺序递增。
总结:
这段代码通过统计每种牌的出现次数,组合可能的三张和两张相同牌面值的组合,找到符合条件的最大葫芦组合,并返回其组成。