合法三元组统计

109 阅读2分钟

小C、小U 和小R 三个好朋友喜欢做一些数字谜题。这次他们遇到一个问题,给定一个长度为n的数组a,他们想要找出符合特定条件的三元组 (i, j, k)。具体来说,三元组要满足 0 <= i < j < k < n,并且 max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1,也就是说,最大值与最小值之差必须为1。
他们决定请你帮忙编写一个程序,计算符合这个条件的三元组数量。


测试样例

样例1:

输入:a = [2, 2, 3, 1]
输出:2

样例2:

输入:a = [1, 3, 2, 2, 1]
输出:5

样例3:

输入:a = [1, 3, 2, 2, 1, 2]
输出:12

解析

我们需要找出数组 `a` 中所有满足以下条件的三元组 `(i, j, k)`:
  1. 0 <= i < j < k < n
  2. max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1

这意味着三元组中的三个元素必须满足最大值和最小值之差为1。

数据结构选择

我们可以使用一个简单的三重循环来遍历所有可能的三元组,并检查每个三元组是否满足条件。

算法步骤

  1. 使用三重循环遍历所有可能的三元组 (i, j, k)
  2. 对于每个三元组,计算 max(a[i], a[j], a[k]) 和 min(a[i], a[j], a[k])
  3. 检查 max(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) 是否等于1。
  4. 如果满足条件,则计数器加1。

代码框架

你可以参考以下代码框架来实现这个算法:

public class Main {
    public static long solution(int[] a) {
        int n = a.length;
        int res = 0;
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                for(int k = j + 1; k < n; k++){
                    // 计算最大值和最小值
                    int max = Math.max(a[i], Math.max(a[j], a[k]));
                    int min = Math.min(a[i], Math.min(a[j], a[k]));
                    
                    // 检查是否满足条件
                    if (max - min == 1) {
                        res++;
                    }
                }
            }
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(solution(new int[]{2, 2, 3, 1}) == 2);
        System.out.println(solution(new int[]{1, 3, 2, 2, 1}) == 5);
        System.out.println(solution(new int[]{1, 3, 2, 2, 1, 2}) == 12);
    }
}

关键步骤

  1. 计算最大值和最小值:使用 Math.max 和 Math.min 函数来计算三元组中的最大值和最小值。
  2. 检查条件:检查 max - min 是否等于1。