📜  门| GATE 2017 模拟 |第 63 题(1)

📅  最后修改于: 2023-12-03 14:58:18.078000             🧑  作者: Mango

Gate 2017 模拟 | 第 63 题

题目描述

给定两个正整数数组A和B,对于A中每个元素a[i],在B中找到一个比a[i]大的最小元素。对于B中的每一个元素b[j],找到A中比b[j]小的最大元素。如果不存在这样的元素,则返回-1。

思路

题目要求在另一个数组中找到符合条件的数,因此我们可以暴力枚举每个元素,但时间复杂度会很高。

我们可以先将数组B排序,然后在B中使用二分查找找到第一个比a[i]大的元素的下标,如果找到了则返回该元素,如果未找到则返回-1。

对于B中的每个元素,我们也可以使用类似的方法,在A中使用二分查找找到第一个比b[j]小的元素的下标,如果找到了则返回该元素,如果未找到则返回-1。

代码实现
def binary_search(arr, target):
    left, right = 0, len(arr) - 1

    while left <= right:
        mid = left + (right - left) // 2

        if arr[mid] == target:
            return mid

        elif arr[mid] < target:
            left = mid + 1

        else:
            right = mid - 1

    return -1

def find_number(A, B):
    B = sorted(B)
    res = []
    for i in A:
        idx = binary_search(B, i)
        if idx == -1:
            res.append(-1)
        else:
            res.append(B[idx])

    res2 = []
    for j in B:
        idx2 = binary_search(A, j)
        if idx2 == -1:
            res2.append(-1)
        else:
            res2.append(A[idx2])

    return res, res2
参考资料