题目描述:
给你两个整数数组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]
"""