[Leetcode][1385. 两个数组间的距离值] 2种方法:模拟 和 二分搜索
By Long Luo
这篇文章是 Leetcode 1385. 两个数组间的距离值 的 力扣社区题解 。
方法一:模拟
对于 \(arr1\) 数组中的每一个元素 \(x\),枚举数组 \(arr2\) 中的每一个元素 \(y\),检查是否对于每一个 \(y\) 都有 \(|x - y| > d\),如果是,就将答案增加 \(1\)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// BF time: O(m * n) space: O(1)
public static int findTheDistanceValue_bf(int[] arr1, int[] arr2, int d) {
int ans = 0;
for (int x : arr1) {
boolean flag = true;
for (int y : arr2) {
if (Math.abs(x - y) <= d) {
flag = false;
}
}
ans += flag ? 1 : 0;
}
return ans;
}
复杂度分析
- 时间复杂度:\(O(mn)\),其中 \(arr1\) 中元素个数为 \(m\),\(arr2\) 中元素个数为 \(n\)。
- 空间复杂度:\(O(1)\)。
方法二: 二分搜索
在方法一中,要知道是否每一个 \(y\) 是不是满足 \(|x - y| > d\),我们枚举了所有 \(y\)。
实际上因为 \(d >= 0\),假如arr2
存在某个 \(y\) 满足 \(x - d \le y \le x + d\),那么arr1
中的数 \(x\) 就不满足要求。
先对arr2
进行排序,之后枚举arr1
每个元素 \(x\),利用二分搜索来判断 \(x\) 是否满足要求。
1 | public int findTheDistanceValue(int[] arr1, int[] arr2, int d) { |
复杂度分析
- 时间复杂度:\(O((n+m) \log m)\),给
arr2
排序的时间代价是 \(O(m \log m)\),对于arr1
中的每个元素都在arr2
中二分的时间代价是 \(O(n \log m)\),故总时间复杂度为 \(O((n+m) \log m)\)。 - 空间复杂度:\(O(1)\)。
All suggestions are welcome. If you have any query or suggestion please comment below. Please upvote👍 if you like💗 it. Thank you:-)
Explore More Leetcode Solutions. 😉😃💗