栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode 1385. 两个数组间的距离值

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 1385. 两个数组间的距离值

题目链接:

力扣https://leetcode-cn.com/problems/find-the-distance-value-between-two-arrays/

【分析】对于arr1中的任意一个arr1[i]来说如果arr2中离arr1[i]最近的两个元素和他的差值都比d大,那么其他元素必然也比d大,所以我们只需要对arr2排序,然后二分查找第一个比arr1[i]大的元素和第一个比arr1[i]小的元素即可。

class Solution {
    
    public int lowerBound(int[] arr, int target){
        int left = 0, right = arr.length - 1, mid;
        while(left <= right){
            mid = (left + right) >> 1;
            if(target < arr[mid]){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return right >= 0 && right < arr.length ? arr[right]: -10001;
    }

    public int upperBound(int[] arr, int target){
        int left = 0, right = arr.length - 1, mid;
        while(left <= right){
            mid = (left + right) >> 1;
            if(target <= arr[mid]){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return left >= 0 && left < arr.length ? arr[left] : 10001;
    }

    public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {
        Arrays.sort(arr2);
        int ans = 0;
        for(var i: arr1){
            if(Math.abs(lowerBound(arr2, i) - i) > d && Math.abs(upperBound(arr2, i) - i) > d) ans++;
        }
        return ans;
    }
}

【方法二】对上面的式子进行变形,要求|arr1[i]-arr2[j]|>d,如果查找到|arr1[i]-arr2[j]|<=d必然不符合要求,变形得arr1[i]-d<=arr2[j]<=arr1[i]+d,所以这里对arr2的二分可以稍微变形一下,查找到在这两个边界内的数就直接返回false即可。

class Solution {
    
    public boolean BinarySearch(int[] arr, int low, int high){
        int left = 0, right = arr.length - 1, mid;
        while(left <= right){
            mid = (left + right) >>> 1;
            if(arr[mid] >= low && arr[mid] <= high) return false;
            else if(arr[mid] < high) left = mid + 1;
            else right = mid - 1;
        }
        return true;
    }
    
    public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {
        Arrays.sort(arr2);
        int low, high, ans = 0;
        for(var i: arr1){
            low = i - d; high = i + d;
            if(BinarySearch(arr2, low, high)) ans++;
        }
        return ans;
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/860426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号