小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)`:0 <= i < j < k < nmax(a[i], a[j], a[k]) - min(a[i], a[j], a[k]) = 1
这意味着三元组中的三个元素必须满足最大值和最小值之差为1。
数据结构选择
我们可以使用一个简单的三重循环来遍历所有可能的三元组,并检查每个三元组是否满足条件。
算法步骤
- 使用三重循环遍历所有可能的三元组
(i, j, k)。 - 对于每个三元组,计算
max(a[i], a[j], a[k])和min(a[i], a[j], a[k])。 - 检查
max(a[i], a[j], a[k]) - min(a[i], a[j], a[k])是否等于1。 - 如果满足条件,则计数器加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);
}
}
关键步骤
- 计算最大值和最小值:使用
Math.max和Math.min函数来计算三元组中的最大值和最小值。 - 检查条件:检查
max - min是否等于1。