1534. 统计好三元组(中等)- LeetCode

题目描述

在这里插入图片描述

解法

题目的要求是求三元组个数,按照暴力解法的话算法复杂度会达到 O ( n 3 ) O(n^3) O(n3),一个比较简便的做法是先求二元组,比如:
∣ a r r [ j ] − a r r [ k ] ∣ ≤ b |arr[j]-arr[k]| ≤ b arr[j]arr[k]b
对于每一个二元组,满足三元组要求的第三个数满足:
∣ a r r [ i ] − a r r [ j ] ∣ ≤ a |arr[i]−arr[j]|≤a arr[i]arr[j]a
∣ a r r [ i ] − a r r [ k ] ∣ ≤ c |arr[i]−arr[k]|≤c arr[i]arr[k]c
拆开绝对值号之后,可以得到符合条件的值,一定落在 [ a r r [ j ] − a , a r r [ j ] + a ] [arr[j]-a,arr[j]+a] [arr[j]a,arr[j]+a] [ a r r [ k ] − c , a r r [ k ] + c ] [arr[k]−c,arr[k]+c] [arr[k]c,arr[k]+c]的交集,记为 [ l , r ] [l,r] [l,r]。为了方便求取交集中数字的个数。我们新开一个记录数字出现频次的数组nums,对于落在区间 [ l , r ] [l,r] [l,r]的数字的个数,可以得到答案 n u m s [ r ] − n u m s [ l − 1 ] nums[r]-nums[l-1] nums[r]nums[l1]。最后算法的复杂度为 O ( n 2 ) O(n^2) O(n2)

class Solution:
    def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
        nums = [0] * 1001
        ans = 0
        length = len(arr)
        for j in range(length):
            for k in range(j+1,length):
                if abs(arr[j]-arr[k]) <= b:
                    r = min(arr[j]+a,arr[k]+c,1000)
                    l = max(arr[j]-a,arr[k]-c,0)
                    if r >= l:
                        ans += nums[r] if l == 0 else nums[r] - nums[l-1]
            for m in range(arr[j],1001):
                nums[m] += 1
        return ans 

在这里插入图片描述

官方解答参考链接:官方解答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值