LeetCode-1534. 统计好三元组【数组 枚举】
2023-12-13 13:38:52
LeetCode-1534. 统计好三元组【数组 枚举】
题目描述:
给你一个整数数组 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 True
return False
n = len(arr)
ans = 0
for 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 += 1
return 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 = 0
n = len(arr)
total = [0] * 1001
for 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] + a
lk, rk = arr[k] - c, arr[k] + c
l = 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] += 1
return ans
时间复杂度:O(n2)两个for
空间复杂度:O(S)前缀和
解题思路三:0
文章来源:https://blog.csdn.net/qq_45934285/article/details/134848286
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!