ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

LeetCode-1534. 统计好三元组【数组 枚举】

LeetCode-1534. 统计好三元组【数组 枚举】

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


返回列表