leetcode
leetcode 1401 ~ 1450
统计好三元组

统计好三元组

难度:

标签:

题目描述

代码结果

运行时间: 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[j] - arr[k]| <= b 以及 |arr[i] - arr[k]| <= c,排序可能会使得快速确定满足这些条件的k较为复杂,因为需要同时保证三个条件。因此,虽然排序有助于某些情况,但实际操作中可能需要结合其他策略,如双指针等,来有效减少迭代次数。
🦆
算法中对于条件 `|arr[i] - arr[j]| <= a` 的检查是在第二层循环中进行的,能否在不满足此条件时提前跳出当前循环以提高效率?
在当前算法中,一旦发现 |arr[i] - arr[j]| > a,即可提前跳出内层循环,因为后续的所有j对于当前的i都不可能再满足 |arr[i] - arr[j]| <= a 的条件。这种提前终止循环的策略可以有效减少不必要的计算,提高算法的效率。
🦆
在题解算法中,是否有必要对数组`arr`进行预处理,比如按大小排序,会不会对算法的执行效率或结果正确性有影响?
对数组进行排序可以帮助某些算法更高效地执行,但在这个特定的问题中,排序可能不会提供明显的好处,因为我们需要考虑的是三个不同元素间的相对差异。排序可能改变元素间原有的索引关系,这对于保持i < j < k的顺序是有影响的。如果考虑排序,可能需要更复杂的逻辑来保证条件还能被正确地检验。因此,排序在这种情况下可能不是最优的预处理步骤。
🦆
给定的例子中输出了好三元组的具体例子,题解是否也应该提供一种方法来输出所有满足条件的好三元组的具体值,而不仅仅是数量?
提供一个方法来输出所有满足条件的好三元组的具体值可以帮助更好地理解算法如何工作以及它的结果。这可以通过修改算法来实现,比如使用一个列表来存储所有满足条件的三元组,然后返回这个列表。这不仅帮助验证算法的正确性,也为调试和学习提供了更多的信息。然而,这会增加空间复杂度,因为需要额外的空间来存储所有符合条件的三元组。

相关问题