LeetCode 1385. Find the Distance Value Between Two Arrays

Given two integer arrays arr1 and arr2, and the integer dreturn the distance value between the two arrays.

The distance value is defined as the number of elements arr1[i] such that there is not any element arr2[j] where |arr1[i]-arr2[j]| <= d.

Example 1:

Input: arr1 = [4,5,8], arr2 = [10,9,1,8], d = 2
Output: 2
Explanation: 
For arr1[0]=4 we have: 
|4-10|=6 > d=2 
|4-9|=5 > d=2 
|4-1|=3 > d=2 
|4-8|=4 > d=2 
For arr1[1]=5 we have: 
|5-10|=5 > d=2 
|5-9|=4 > d=2 
|5-1|=4 > d=2 
|5-8|=3 > d=2
For arr1[2]=8 we have:
|8-10|=2 <= d=2
|8-9|=1 <= d=2
|8-1|=7 > d=2
|8-8|=0 <= d=2

Example 2:

Input: arr1 = [1,4,2,3], arr2 = [-4,-3,6,10,20,30], d = 3
Output: 2

Example 3:

Input: arr1 = [2,1,100,3], arr2 = [-5,-2,10,-3,7], d = 6
Output: 1

Constraints:

  • 1 <= arr1.length, arr2.length <= 500
  • -1000 <= arr1[i], arr2[j] <= 1000
  • 0 <= d <= 100

这题第一反应就是读不懂题,第二反应就是不会做,嗯,看了答案确实如同大家所说的这道题的表述绝对有点问题,太绕了!已经不想解释这道题到底想让我干嘛了毕竟现在脑子已经不清醒了……大概就是要在另一个数组里找对于某个数字来说,是不是所有数字和这个数字的绝对值之差都大于一个数。

于是就可以转换成二分查找的思想,找到在这个数组里这个数字应该插在哪儿,并比较离他最近的两个数字和它的绝对值之差看是不是都大于d,如果都大于那就符合条件。

于是就艰难地写了个二分,历尽千辛万苦凭借一己之力和一些些看小笔记发现愚蠢错误,最后写出来了,啊。几个愚蠢错误:

1. end = arr.length - 1忘了- 1

2. num < arr[mid] 忘了arr[]

3. 这道题绕来绕去的大于小于也傻傻分不清

对于二分插入的思想我写在二分大总结里了:LeetCode 704. Binary Search_wenyq7的博客-CSDN博客

精华思想就在于,还是用low <= high的判断条件,最后的顺序是high, num, low。

class Solution {
    public int findTheDistanceValue(int[] arr1, int[] arr2, int d) {
        int result = 0;
        Arrays.sort(arr2);

        for (int i : arr1) {
            if (allLarger(i, arr2, d)) {
                result++;
            }
        }
        return result;
    }

    private boolean allLarger(int num, int[] arr, int d) {
        // find the position i for num to insert into arr
        // then check if the diff between (arr[i - 1] and arr[i + 1]) and num > d
        int start = 0;
        int end = arr.length - 1;

        while (start <= end) {
            int mid = start + (end - start) / 2;
            if (num > arr[mid]) {
                start = mid + 1;
            } else if (num < arr[mid]) {
                end = mid - 1;
            } else {
                return 0 > d;
            }
        }
        // end start
        if (end < 0) {
            return arr[0] - num > d;
        }
        if (start > arr.length - 1) {
            return num - arr[arr.length - 1] > d;
        }
        return (num - arr[end] > d) && (arr[start] - num > d);
    }
}

以及看到有人直接用了TreeSet,机智,只要记得还有这个数据结构能用就行,真懒得花时间了:LeetCode - The World's Leading Online Programming Learning Platform

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值