1. 问题背景与理解
今天遇到一道挺有意思的LeetCode题目(编号1385),题目要求计算两个数组间的"距离值"。乍看题目描述有点绕,但仔细分析后发现核心是考察数组元素的条件筛选能力。题目给定两个整数数组arr1和arr2,以及一个整数d,要求统计arr1中满足特定条件的元素个数。
这个特定条件是:对于arr1中的某个元素a,arr2中所有元素b都满足|a - b| > d。换句话说,arr1中的元素a如果与arr2中的每个元素距离都超过d,那么这个a就被计入最终结果。
注意题目中的"距离"指的是绝对差值,不是欧式距离或其他距离度量方式。这是很多新手容易误解的地方。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法思路分析
2.1 暴力解法
最直观的解法就是双重循环:对arr1中的每个元素,遍历arr2中的所有元素检查是否满足距离条件。这种解法时间复杂度是O(n*m),其中n和m分别是两个数组的长度。
python复制def findTheDistanceValue(arr1, arr2, d):
count = 0
for a in arr1:
valid = True
for b in arr2:
if abs(a - b) <= d:
valid = False
break
if valid:
count += 1
return count
虽然这种解法在LeetCode上也能AC(Accepted),但对于大规模数据效率不高。我在本地测试时发现,当数组长度超过10^4时,运行时间明显变长。
2.2 优化思路
观察到题目要求的是"所有"arr2元素都满足条件,这意味着:
- 如果arr1中的元素a比arr2中的所有元素都大,那么只需要检查a与arr2最大元素的差值
- 如果a比arr2中所有元素都小,只需要检查a与arr2最小元素的差值
- 如果a位于arr2的最小和最大值之间,需要找到arr2中最接近a的元素进行检查
基于这个观察,我们可以先对arr2排序,然后对每个arr1中的元素a:
- 使用二分查找确定a在arr2中的插入位置
