代码之家  ›  专栏  ›  技术社区  ›  dhs4402

在给定输入的具有重复项的排序数组中找到正确的区间

  •  1
  • dhs4402  · 技术社区  · 1 年前

    我正在努力解决一个数组问题,我不太确定如何用二分查找正确解决这个问题。

    假设x是一个有重复值的排序数组。给定x_input,找到排序数组中两个相邻元素x_i,x_j的索引,使得x_i<x_输入<=x_j。请注意,排序后的数组中有重复项,所以如果这个区间的右侧存在重复项,基本上就是x_input<=x_j,我们需要确保j是所有其他具有相同值的元素中最小的索引。如果左侧有重复项,x_input>x_i,i必须是具有相同值的所有其他元素中最大的索引。然后返回[x_i,x_j]。

    a = [-2, -1, -1, -1, 2, 2, 5]

    一些测试用例是:

    if x_input = -1.5, then return [0, 1]
    if x_input = -1, then return [0, 1]
    if x_input = 2, then return [3, 4]
    if x_input = 2.1, then return [6, 7]
    

    我是算法新手,想知道是否有人能解释一下如何用二分查找来解决这个问题,或者给我一个可以参考的leetcode问题。谢谢。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Unmitigated    1 年前

    在数组中执行二分查找 x_input 不检查是否 x_输入 找到了。最后, high 将是区间的左侧索引(最后一个元素的索引小于 x_输入 )以及 low 将是正确的索引(第一个元素的索引大于或等于 x_输入 ).

    例如,在Python中:

    def find_interval(arr, x):
        low = 0
        high = len(arr) - 1
        while low <= high:
            mid = (low + high) // 2
            if arr[mid] < x:
                low = mid + 1
            else:
                high = mid - 1
        return high, low