【力扣练题之二分查找】1385:两个数组间的距离值

这篇博客讨论了一种寻找两个整数数组中,元素之间满足特定距离条件的数量的问题。给出了两种解决方案,包括原始的双层循环方法和使用排序及二分查找的方法,后者在效率上有所提升。文章通过示例解释了每种方法的工作原理,并分析了时间复杂度。
摘要由CSDN通过智能技术生成

题目描述:

给你两个整数数组arr1,arr2和一个整数d,请你返回两个数组之间的距离值。

「距离值」定义为符合此距离要求的元素数目:对于元素arr1[i],不存在任何元素arr2[j]满足 |arr1[i]-arr2[j]| <= d

示例与解释:
输入:arr1 = [4,5,8], arr2 = [10,9,1,8], d = 2
输出:2
解释:
对于 arr1[0]=4 我们有:
|4-10|=6 > d=2
|4-9|=5 > d=2
|4-1|=3 > d=2
|4-8|=4 > d=2
所以 arr1[0]=4 符合距离要求

对于 arr1[1]=5 我们有:
|5-10|=5 > d=2
|5-9|=4 > d=2
|5-1|=4 > d=2
|5-8|=3 > d=2
所以 arr1[1]=5 也符合距离要求

对于 arr1[2]=8 我们有:
|8-10|=2 <= d=2
|8-9|=1 <= d=2
|8-1|=7 > d=2
|8-8|=0 <= d=2
存在距离小于等于 2 的情况,不符合距离要求

故而只有 arr1[0]=4 和 arr1[1]=5 两个符合距离要求,距离值为 2
我自己的解法:

class Solution:
    def findTheDistanceValue(self, arr1, arr2, d: int) -> int:
        cnt = 0
        for i in range(len(arr1)):
            str1 = 0
            for j in range(len(arr2)):
                if abs(arr1[i] - arr2[j]) > d:
                    str1 += 1
            if str1 == len(arr2):
              cnt += 1
        return cnt

虽然也是能解答这个问题,但是时间复杂度为O(mn),假设arr1的长度为m,arr2的长度为n。
再来看看官方的解法:

class Solution:
    def findTheDistanceValue_1(self, arr1, arr2, d: int) -> int:
        cnt = 0
        for x in arr1:
            if all(abs(x-y) > d for y in arr2):
                cnt += 1
        return cnt

这个解法的时间复杂度也是O(mn).

我们再来分析一下题意,发现我们是针对每一个arr1的元素检查arr2的每个元素的距离,如果有小于等于距离d的情况arr1的这个元素就是不符合要求的元素,不能计数。

class Solution:
    def findTheDistanceValue_1(self, arr1, arr2, d: int) -> int:
        arr2.sort() #对arr2进行排序
        cnt = 0
        for x in arr1:
            p = bisect.bisect_left(arr2,x) #找到元素x在arr2中的位置,
            if p == len(arr2) or abs(x - arr2[p]) > d: #arr2[p]是与x最接近的数字
                if p == 0 or abs(x - arr2[p-1]) > d:
                    cnt += 1
        return cnt
        """
arr2 = [-5,-2,10,-3,7]
arr2.sort()
print(bisect.bisect_left(arr2,10)) # 4 当插入的元素和序列中的某一个元素相同时,该插入到该元素的前面(左边,left),还是后面(右边)
arr2.insert(4,10)
print(arr2) # [-5, -3, -2, 7, 10, 10]
        """
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老师好,我是刘同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值