给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。
「距离值」 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d 。
方法一:暴力破解,两次循环
时间复杂度:O(N^2)
空间复杂度:O(1)
class Solution {
public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {
int dis = 0;
for(int i = 0; i < arr1.length; i++){
boolean flag = true;
for(int j = 0; j < arr2.length; j++){
if(Math.abs(arr1[i] - arr2[j]) <= d){
flag = false;
break;
}
}
if(flag == true) dis++;
}
return dis;
}
}
方法二:运用二分查找
class Solution {
public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {
Arrays.sort(arr2);
int hi = arr2.length - 1;
int count = 0;
for(int i : arr1){
int index = binarySearch(arr2, 0, hi, i);
if(index == 0){
if(Math.abs(arr2[index] - i) > d)
count++;
} else if(index == hi + 1) {
if(Math.abs(arr2[hi] - i) > d)
count++;
} else {
if(Math.abs(arr2[index] - i) > d && Math.abs(arr2[index - 1] - i) > d)
count++;
}
}
return count;
}
private int binarySearch(int[] arr, int lo, int hi, int target){
while(lo <= hi){
int mid = (hi - lo) / 2 + lo;
if(arr[mid] < target) lo = mid + 1;
else if(arr[mid] > target) hi = mid - 1;
else return mid;
}
return lo;
}
}