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