给定一定数量的扑克牌,从中找到符合“葫芦”规则的最大组合。一个“葫芦”由三张相同的牌 (a) 和两张相同的牌 (b) 组成。题目要求返回符合规则的最大“葫芦”组合,结果按照 [a, b] 的顺序输出(a 是三张牌,b 是两张牌)。如果找不到符合规则的组合,输出 [0, 0]。
解题思路
-
统计牌的数量 使用数组
count(长度为 14,索引从 1 到 13 对应牌面)统计每种牌面出现的次数。这一步可以帮助我们快速判断某张牌是否可以组成三张或两张。 -
分类为三张和两张
- 遍历
count数组,如果某张牌的数量大于等于 3,则可以组成三张牌,将其加入threeCards列表。 - 如果某张牌的数量大于等于 2,则可以组成两张牌,将其加入
twoCards列表。
- 遍历
-
查找最大的“葫芦”组合
-
遍历所有可能的
(a, b)组合,其中a是threeCards中的一个元素,b是twoCards中的一个元素。 -
确保
a != b,因为三张牌和两张牌必须是不同的牌面。 -
计算组合的总值
sum = 3 * a + 2 * b,检查是否满足限制条件sum <= max。 -
按照优先级规则比较大小:
- 优先选择三张牌面值大的组合。
- 如果三张牌面值相等,再选择两张牌面值大的组合。
-
-
返回结果
- 如果找到符合规则的组合,返回
[a, b]。 - 如果没有找到,返回
[0, 0]。
- 如果找到符合规则的组合,返回
import java.util.*;
public class Main { public static int[] solution(int n, int max, int[] array) { // 统计每种牌面出现的次数 int[] count = new int[14]; // 索引从1到13对应牌面 for (int card : array) { count[card]++; }
List<Integer> threeCards = new ArrayList<>();
List<Integer> twoCards = new ArrayList<>();
// 根据次数分类为三张和两张
for (int i = 13; i >= 1; i--) {
if (count[i] >= 3) {
threeCards.add(i); // 可以组成三张的牌面
}
if (count[i] >= 2) {
twoCards.add(i); // 可以组成两张的牌面
}
}
int bestA = 0; // 最好的三张牌的值
int bestB = 0; // 最好的两张牌的值
// 遍历所有三张和两张的组合,找到最优解
for (int a : threeCards) {
for (int b : twoCards) {
if (a != b) { // 确保三张和两张是不同的牌面
int sum = 3 * a + 2 * b; // 计算总值
if (sum <= max) { // 确保满足总值限制
// 按优先级规则更新最佳组合
if (a > bestA || (a == bestA && b > bestB)) {
bestA = a;
bestB = b;
}
}
}
}
}
// 如果没有找到合法的组合,返回 [0, 0]
if (bestA == 0 && bestB == 0) {
return new int[]{0, 0};
}
// 返回三张牌在前,两张牌在后的结果
return new int[]{bestA, bestB};
}
public static void main(String[] args) {
// 测试用例
System.out.println(Arrays.equals(solution(9, 34, new int[]{6, 6, 6, 8, 8, 8, 5, 5, 1}), new int[]{8, 5}));
System.out.println(Arrays.equals(solution(9, 37, new int[]{9, 9, 9, 9, 6, 6, 6, 6, 13}), new int[]{6, 9}));
System.out.println(Arrays.equals(solution(9, 40, new int[]{1, 11, 13, 12, 7, 8, 11, 5, 6}), new int[]{0, 0}));
System.out.println(Arrays.equals(solution(31, 42, new int[]{3, 3, 11, 12, 12, 2, 13, 5, 13, 1, 13, 8, 8, 1, 8, 13, 12, 9, 2, 11, 3, 5, 8, 11, 11, 1, 11, 1, 5, 4, 2, 5}), new int[]{1, 13}));
}
}