点击获取AI摘要

1534. 统计好三元组 E

给你一个整数数组 arr ,以及 abc 三个整数。请你统计其中好三元组的数量。

如果三元组 (arr[i], arr[j], arr[k]) 满足下列全部条件,则认为它是一个 好三元组

  • 0 <= i < j < k < arr.length
  • |arr[i] - arr[j]| <= a
  • |arr[j] - arr[k]| <= b
  • |arr[i] - arr[k]| <= c

其中 |x| 表示 x 的绝对值。

返回 好三元组的数量

示例 1:

输入: arr = [3,0,1,1,9,7], a = 7, b = 2, c = 3
输出: 4
解释: 一共有 4 个好三元组:[(3,0,1), (3,0,1), (3,1,1), (0,1,1)] 。

示例 2:

输入: arr = [1,1,2,2,3], a = 0, b = 0, c = 1
输出: 0
解释: 不存在满足所有条件的三元组。

提示:

  • 3 <= arr.length <= 100
  • 0 <= arr[i] <= 1000
  • 0 <= a, b, c <= 1000

问题分析

给定数组 arr,以及三个整数 a、b、c,需要统计满足以下三个条件的三元组 (arr[i], arr[j], arr[k]) 的数量(其中 0 <= i < j < k < len(arr)):

  • |arr[i] - arr[j]| <= a
  • |arr[j] - arr[k]| <= b
  • |arr[i] - arr[k]| <= c

算法思路

  • 暴力枚举:直接使用三重循环枚举所有可能的三元组,然后检查是否满足条件。
  • 提前剪枝:在第二层循环中,若abs(arr[i] - arr[j]) > a则直接跳过第三层循环(k),减少无效计算。

时间复杂度

  • 对于数组长度 n,每个三元组枚举的时间复杂度为 O(n³)。由于题目约束 3 <= n <= 100,当 n = 100 时,最多循环大约 161700 次,在可接受的范围内。

  • 除了输入数组与常数级变量外,未使用额外数据结构,因此空间复杂度为 O(1)。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from typing import List

class Solution:
def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
count = 0
n = len(arr)
for i in range(n):
for j in range(i + 1, n):
if abs(arr[i] - arr[j]) > a:
continue # 提前剪枝,不满足a条件则跳过后续k的判断
for k in range(j + 1, n):
# 同时检查b和c的条件
if (abs(arr[j] - arr[k]) <= b) and (abs(arr[i] - arr[k]) <= c):
count += 1
return count