题目解析
本题数量级非常大,因此使用双重for是肯定会超时的。
我的解题思路是利用二分查找。
关于标准二分查找的实现可以参考Java的Arrays.binarySearch,其他语言实现可以看:
算法设计 - 二分法和三分法,洛谷P3382_伏城之外的博客-优快云博客
中关于binarySearch的具体实现,特别是其中关于有序插入位置的实现原理。
本题,我们只需要遍历每一个a[i],然后通过二分查找去找他们在b中的位置 j :
- 如果 j >= 0,则说明b数组中有一个b[j] == a[i],此时a[i] b[j]就是符合要求的组合
- 如果 j < 0,则说明b数组中没有b[j] == a[i],此时 j 其实就是 - insertIdx - 1,其中insertIdx就是a[i]在b中的有序插入位置,因此b[insertIdx] > a[i],如果 b[insertIdx] - a[i] <= r,那么a[i] b[insertIdx]就是符合要求的组合
上面算法的事件复杂度只有O(nlogn),不会超时。
2023.06.15
找到的有序插入位置可能 ins