Leetcode C++ 《第22场双周赛-1》 5348.两个数组间的距离值
1. 题目
给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。
「距离值」 定义为符合此描述的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d 。
示例 1:
输入: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[1]=5 我们有:
|5-10|=5 > d=2
|5-9|=4 > d=2
|5-1|=4 > d=2
|5-8|=3 > d=2
对于 arr1[2]=8 我们有:
|8-10|=2 <= d=2
|8-9|=1 <= d=2
|8-1|=7 > d=2
|8-8|=0 <= d=2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-distance-value-between-two-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 思路
- 看问题的本质,找x在arr2中距离每个元素的最短距离,判断和d的距离
- 将arr2进行排序,然后二分查找:
- 对于x,在arr2找到第一个比x大的元素的index,然后min(x-arr2[index-1], x-arr2[index])
- index = 0, abs(x-arr2[index])
- index 超出范围, 都比排好序的小,abs(x-arr2[arr2.size()-1])
- 时间复杂度o(nlogn)
3. 代码
class Solution {
public:
int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {
sort(arr2.begin(), arr2.end());
int minLength;
int res = 0;
//二分查找,对于x,在arr2找到第一个比x大的元素的index,然后min(x-arr2[index-1], x-arr2[index])
// index = 0, abs(x-arr2[index])
// index 超出范围, 都比排好序的小,abs(x-arr2[arr2.size()-1])
for (int i = 0; i < arr1.size(); i++) {
int keyIndex = binaryMoreThanX(arr2, 0, arr2.size()-1, arr1[i]);
if (keyIndex == 0)
minLength = arr2[0]-arr1[i];
else if (keyIndex == arr2.size())
minLength = arr1[i] - arr2[keyIndex-1];
else
minLength = min(arr1[i]-arr2[keyIndex-1], arr2[keyIndex]-arr1[i]);
if (minLength > d) {
//所有的元素都大于d
res++;
//cout << arr1[i] << " " << minLength << endl;
}
}
return res;
}
int binaryMoreThanX(vector<int> num, int start, int end, int x) {
int l = start, r = end;
//如果x在最大值和最小值之间,返回大于x的index
//如果x小于最小值,返回0,正确
//如果x大于最大值,返回的是index+1
while(l <= r) {
int mid = (l+r) >> 1;
if(num[mid] <= x)
l = mid + 1;
else
r = mid - 1;
}
return l;
}
};