两个数组间的距离值--二分法

0x01.问题

给你两个整数数组 arr1arr2 和一个整数 d ,请你返回两个数组之间的 距离值
「距离值」 定义为符合此描述的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足
|arr1[i]-arr2[j]| <= d
输入示例:arr1 = [4,5,8], arr2 = [10,9,1,8], d = 2
输出示例:2
提示:1 <= arr1.length, arr2.length <= 500 -10^3 <= arr1[i], arr2[j] <= 10^3
0 <= d <= 100

C++函数形式:  int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d)

0x02.简要分析

读题,注意题目中的距离值实际指的是满足指定条件的元素个数,而且条件是不存在。

暴力枚举,肯定可以做到,时间复杂度为O(N^2),显然不是最好的方法,这里我们采用二分查找的方法。

我们发现题目的核心在于那个绝对值等式,只需要那个绝对值的最小值都大于d,肯定是满足的,所以我们其实只要找到那个绝对值的最小值就行了,不需要遍历整个数组。

两个数越相近,绝对值越小,所以我们可以找到最相近的那个数,于是我们的二分思路就来了。

首先对数组进行排序,排序后,用二分法找到刚好比arr1中大一点的数,假设下标为b然后我们看arr2[b]-aarr2[b-1]-1,arr2[b+1]-1,这三个数是否满足条件就行了,因为绝对值的最小值一定在这三个中取到,当然,还要额外注意找的这个数是否是边界下标。

0x03.解决代码–二分法(O(N*logN))

class Solution {
public:
    int biSh(int left,int right,vector<int>& arr,int target){
        if(left>=right) return left;
        int mid=(left+right)/2;
        if(arr[mid]==target) return mid;
        return arr[mid]<target?biSh(mid+1,right,arr,target):biSh(left,mid,arr,target);
    }
    int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {
        int ans=0;
        int n=arr2.size()-1;
        sort(arr2.begin(),arr2.end());
        for(int a:arr1){
            int b=biSh(0,n,arr2,a);
            if(abs(arr2[b]-a)<=d) continue;
            else if(abs(arr2[max(0,b-1)]-a)<=d) continue;
            else if(abs(arr2[min(n,b+1)]-a)<=d) continue;
            ans++;
        }
        return ans;
    }
};

在这里插入图片描述

ATFWUS --Writing By 2020–03–23

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是C语言的代码实现: ```c #include <stdio.h> int inputArray(int arr[]) { int i = 0; while (1) { scanf("%d", &arr[i]); if (arr[i] == -9999) { break; } i++; } return i; } void sortArray(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (arr[i] > arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } int binarySearch(int arr[], int n, int key) { int left = 0, right = n - 1, mid; while (left <= right) { mid = (left + right) / 2; if (arr[mid] == key) { return mid; } else if (arr[mid] > key) { right = mid - 1; } else { left = mid + 1; } } return -1; } int main() { int arr[100]; int n = inputArray(arr); sortArray(arr, n); printf("The sorted array is: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); int key; printf("Enter the number you want to search: "); scanf("%d", &key); int index = binarySearch(arr, n, key); if (index == -1) { printf("%d not found in the array.\n", key); } else { printf("%d found at index %d.\n", key, index); } return 0; } ``` 该程序包括三个函数: 1. `inputArray`:输入数组元素,并返回数组长度; 2. `sortArray`:将数组元素从小到大排序; 3. `binarySearch`:在有序数组中查找给定的元素,返回元素的下标,如果找不到则返回-1。 程序先调用 `inputArray` 函数输入数组元素,再调用 `sortArray` 函数将数组元素从小到大排序,然后提示用户输入要查找的数字,调用 `binarySearch` 函数在排序后的数组中查找该数字。最后输出查找结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ATFWUS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值