题目描述
自己解法
没想到除了暴力求解以外的解法,时间复杂度 O ( m n ) O(mn) O(mn),空间复杂度 O ( 1 ) O(1) O(1)。
class Solution:
def findTheDistanceValue(self, arr1: List[int], arr2: List[int], d: int) -> int:
ans = 0
for val1 in arr1:
exist_d = True
for val2 in arr2:
if abs(val1-val2) <= d:
exist_d = False
break
if exist_d:
ans += 1
return ans
题解区
暴力解法:
class Solution:
def findTheDistanceValue(self, arr1: List[int], arr2: List[int], d: int) -> int:
cnt = 0
for x in arr1:
if all(abs(x - y) > d for y in arr2):
cnt += 1
return cnt
二分查找:首先对 a r r 2 arr2 arr2排序,针对 a r r 1 arr1 arr1中的每个元素 x x x,只需要在 a r r 2 arr2 arr2中二分查找到两个元素:
- 大于等于 x x x的元素 y 1 y_1 y1
- 小于 x x x的元素 y 2 y_2 y2
再对这两个元素判断即可,时间复杂度 O ( ( m + n ) l o g m ) O((m+n)logm) O((m+n)logm),空间复杂度 O ( 1 ) O(1) O(1)
具体参考:官方解答
class Solution:
def findTheDistanceValue(self, arr1: List[int], arr2: List[int], d: int) -> int:
arr2.sort()
cnt = 0
for x in arr1:
p = bisect.bisect_left(arr2, x)
if p == len(arr2) or abs(x - arr2[p]) > d:
if p == 0 or abs(x - arr2[p - 1]) > d:
cnt += 1
return cnt