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;
}
};