LeetCode-1534. 统计好三元组【数组 枚举】
- 题目描述:
- 解题思路一:由于arr.length不大可以进行暴力枚举。
- 解题思路二:优化算法,先只考虑二元组 (j,k),题目剩下的部分就是得到满足条件l <= arr[i] <= r的arr[i]的个数。(其中l,r是i需要满足题目中的条件的一个交集)
- 解题思路三:0
题目描述:
给你一个整数数组 arr ,以及 a、b 、c 三个整数。请你统计其中好三元组的数量。
如果三元组 (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.length不大可以进行暴力枚举。
class Solution:def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:def judge_3(x,y,z,a,b,c):if abs(x-y)<=a and abs(y-z)<=b and abs(x-z)<=c:return Truereturn Falsen = len(arr)ans = 0for i in range(n-2):for j in range(i+1,n-1,1):for k in range(j+1,n,1): if judge_3(arr[i],arr[j],arr[k],a,b,c):ans += 1return ans
时间复杂度:O(n3) 3个for循环
空间复杂度:O(1)
解题思路二:优化算法,先只考虑二元组 (j,k),题目剩下的部分就是得到满足条件l <= arr[i] <= r的arr[i]的个数。(其中l,r是i需要满足题目中的条件的一个交集)
如何统计l <= arr[i] <= r的arr[i]的个数?
这里用的是前缀和。即下面的total。
当k 大于等于arr[j]的时候前缀和加一
class Solution:def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:ans = 0n = len(arr)total = [0] * 1001for j in range(n):for k in range(j + 1, n):if abs(arr[j] - arr[k]) <= b:lj, rj = arr[j] - a, arr[j] + alk, rk = arr[k] - c, arr[k] + cl = max(0, lj, lk)r = min(1000, rj, rk)if l <= r:ans += total[r] if l == 0 else total[r] - total[l - 1]for k in range(arr[j], 1001):total[k] += 1return ans
时间复杂度:O(n2)两个for
空间复杂度:O(S)前缀和
解题思路三:0