统计好三元组
难度:
标签:
题目描述
代码结果
运行时间: 139 ms, 内存: 16.1 MB
/*
* 题目思路:
* 给定一个整数数组 arr 和整数 a, b, c,要求统计其中满足以下条件的三元组的数量:
* 1. 0 <= i < j < k < arr.length
* 2. |arr[i] - arr[j]| <= a
* 3. |arr[j] - arr[k]| <= b
* 4. |arr[i] - arr[k]| <= c
* 使用 Java Stream 处理。
*/
import java.util.stream.IntStream;
public class GoodTripletsStream {
public long countGoodTriplets(int[] arr, int a, int b, int c) {
return IntStream.range(0, arr.length - 2)
.flatMap(i -> IntStream.range(i + 1, arr.length - 1)
.filter(j -> Math.abs(arr[i] - arr[j]) <= a)
.flatMap(j -> IntStream.range(j + 1, arr.length)
.filter(k -> Math.abs(arr[j] - arr[k]) <= b && Math.abs(arr[i] - arr[k]) <= c)))
.count();
}
public static void main(String[] args) {
GoodTripletsStream solution = new GoodTripletsStream();
int[] arr = {3, 0, 1, 1, 9, 7};
int a = 7, b = 2, c = 3;
System.out.println(solution.countGoodTriplets(arr, a, b, c)); // 输出 4
}
}
解释
方法:
题解采用了三层嵌套循环来枚举所有可能的三元组 (i, j, k),其中 i < j < k。外层循环遍历数组arr以选择第一个元素i,中层循环从i之后开始遍历以选择第二个元素j,内层循环从j之后开始遍历以选择第三个元素k。对于每一个可能的三元组,检查是否满足题目中给定的三个条件:|arr[i] - arr[j]| <= a, |arr[j] - arr[k]| <= b, 和 |arr[i] - arr[k]| <= c。若满足这些条件,计数器count增加1。
时间复杂度:
O(n^3)
空间复杂度:
O(1)
代码细节讲解
🦆
在这种三层嵌套循环中,是否有可能通过排序或其他优化手段减少内层循环的迭代次数?
▷🦆
算法中对于条件 `|arr[i] - arr[j]| <= a` 的检查是在第二层循环中进行的,能否在不满足此条件时提前跳出当前循环以提高效率?
▷🦆
在题解算法中,是否有必要对数组`arr`进行预处理,比如按大小排序,会不会对算法的执行效率或结果正确性有影响?
▷🦆
给定的例子中输出了好三元组的具体例子,题解是否也应该提供一种方法来输出所有满足条件的好三元组的具体值,而不仅仅是数量?
▷