寻找最大葫芦

120 阅读2分钟

寻找最大葫芦 好的,让我们来逐步分析这个问题并提供一个解题思路。 需要从给定的牌中找到一个“葫芦”组合,即三张相同牌面值的牌和两张相同牌面值的牌,并且这个组合的牌面值之和不能超过给定的最大值 max。我们需要找到符合条件的最大“葫芦”组合。

  1. 计数数组:我们可以使用一个长度为14的数组来统计每种牌面值的数量。数组的索引对应牌面值(1到13),数组的值对应该牌面值的数量。

算法步骤

  1. 统计每种牌的数量:遍历输入的牌数组,统计每种牌面值的数量。
  2. 寻找最大“葫芦”组合
    • 从最大的牌面值开始(13到1),尝试找到三张相同牌面值的牌(记为 a)。
    • 对于每个 a,再从最大的牌面值开始(13到1),尝试找到两张相同牌面值的牌(记为 b),使得 a*3 + b*2 <= max
    • 如果找到符合条件的 ab,记录并返回。
  3. 如果没有找到符合条件的“葫芦”组合,返回 {0, 0}

代码框架

以下是一个代码框架,包含了上述思路的实现:

import java.util.Arrays;

public class Main {
    public static int[] solution(int n, int max, int[] array) {
        int[] count = new int[14]; // 统计每种牌的数量
        for (int card : array) {
            count[card]++;
        }

        // 从最大的牌面值开始寻找符合条件的“葫芦”组合
        for (int a = 13; a >= 1; a--) {
            if (count[a] >= 3) { // 找到三张相同牌面值的牌
                for (int b = 13; b >= 1; b--) {
                    if (a != b && count[b] >= 2 && a * 3 + b * 2 <= max) {
                        return new int[]{a, b};
                    }
                }
            }
        }

        return new int[]{0, 0}; // 如果没有找到符合条件的“葫芦”组合
    }

    public static void main(String[] args) {
        int n = 9;
        int max = 34;
        int[] array = {6, 6, 6, 8, 8, 8, 1, 5, 5};
        System.out.println(Arrays.toString(solution(n, max, array)));
    }
}

关键步骤解释

  1. 统计每种牌的数量:使用 count 数组记录每种牌面值的数量。
  2. 寻找最大“葫芦”组合
    • 外层循环从13到1遍历,寻找三张相同牌面值的牌 a
    • 内层循环从13到1遍历,寻找两张相同牌面值的牌 b,并且 a != ba * 3 + b * 2 <= max
    • 如果找到符合条件的 ab,返回 {a, b}
  3. 如果没有找到符合条件的“葫芦”组合,返回 {0, 0}