青训营豆包 | 豆包MarsCode AI 刷题

50 阅读2分钟

寻找最大葫芦

题目分析

我们需要找到一组牌中符合“葫芦”规则的最大组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这五张牌的牌面值之和不能超过给定的最大值 max

算法步骤

  1. 统计每种牌面值的数量:遍历输入的牌数组,使用 Map<Integer, Integer> 统计每种牌面值的数量。

  2. 找到所有可能的“葫芦”组合

    • 遍历 countMap,将数量大于等于3的牌面值加入 possibleTriplets 列表。
    • 将数量大于等于2的牌面值加入 possiblePairs 列表。
  3. 选择符合条件的最大“葫芦”组合

    • 遍历 possibleTriplets 和 possiblePairs,计算每种组合的牌面值之和。
    • 如果组合的牌面值之和不超过 max,则比较当前组合与已知最大组合的大小。
    • 更新最大组合。
  4. 返回结果:如果找到符合条件的“葫芦”组合,返回该组合;否则返回 [0, 0]

代码+分析

1. 统计每种牌的数量

9ed5f81d366683313da60a9fef4c49f.png 这段代码的作用是统计数组中每种牌的出现次数。countMap 是一个映射,其中 key 是牌面值,value 是对应的牌面值的出现次数。

2. 找出所有可能的三张相同牌(Triplets)和两张相同牌(Pairs)

c54ebec36b5f97c27af61ad8417ea3d.png 根据牌面值的出现次数,将满足以下条件的牌加入对应的列表:

  • 如果某种牌出现次数大于等于3,则将其作为三张相同的牌(Triplet)加入 possibleTriplets 列表。
  • 如果某种牌出现次数大于等于2,则将其作为两张相同的牌(Pair)加入 possiblePairs 列表。

3. 遍历所有三张相同牌和两张相同牌,找到符合条件的最大葫芦组合

71348cec0c3605625fc1b04124c0ae1.png 这段代码遍历所有的三张相同牌和两张相同牌,试图找到符合条件的最大葫芦组合:

  • 只有当三张牌和两张牌的牌面值不相同(triplet[0] != pair[0])时,才认为这是一种有效的组合。
  • 如果该组合的总和(sum = triplet[0] * 3 + pair[0] * 2)不超过最大值 max,则尝试更新最大葫芦组合。
  • 使用 compareCards 函数来比较当前的组合是否比已有的最大组合更大。这个比较是先比较三张牌的牌面值,如果三张牌相同,则比较两张牌的牌面值。

4. 比较两张牌的大小

6fd955a997fab71a4e7c238f8eddd54.png 这个方法用来比较两张牌的大小,具体规则是:A (1) 被认为是最大的牌,值为14,其它牌的值按顺序递增。

总结:

这段代码通过统计每种牌的出现次数,组合可能的三张和两张相同牌面值的组合,找到符合条件的最大葫芦组合,并返回其组成。