Leetcode C++ 《第22场双周赛-1》 5348.两个数组间的距离值

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章