【发布时间】:2020-09-05 00:09:21
【问题描述】:
输入:一个排序数组 A(所有元素都是整数,并且按递增顺序不同)和 c(整数)
输出:返回一个随机选择的索引,使该索引满足要求:|A[i]-i| <= c
在最坏的情况下,它应该在 O(logN) 时间内运行。
我最初的想法是二进制搜索索引i,这样A[i] = 0或最接近0。然后这个索引将数组分成2部分。
左边部分包含元素 0。
对于右边部分,运行一个类似于二分查找的算法来检查中间值,看看是否有A[mid]-mid <=c,如果是,转到[mid+1, end]。但是,当我有以下示例时,我发现了这个问题:
c=2
i 0 1 2 3 4 5 6 7
A[i] -5 -4 -1 0 1 5 8 9
A[4] 不符合 |A[4]-4| <=2 但它会包含在我的算法中。
所以我现在完全不知道这个问题......
【问题讨论】:
-
想象一个数组,其中元素是
A[i]-i。该数组保证按升序排序。所以你需要做的就是对最接近 0 的元素进行二分搜索。 -
@user3386109。它不是升序排序的。有绝对值。如果已排序,只需取第一个元素。无需搜索
-
@MadPhysicist 对于给定的示例,
A[i]-i的虚拟数组是{-5,-5,-3,-3,-3,0,2,2}。在我看来,这似乎是上升的。通常情况下确实如此,因为 OP 指定A的元素是不同的,这意味着A的元素必须至少与索引一样快。 -
@גלעדברקן 当然是,但 OP 询问的是 abs(A[i] - i)。否则这简直是微不足道的
-
@גלעדברקן 是的,接近零的元素将数组分成两部分。然后,您可以对这两个部分进行二进制搜索,以在每个匹配条件的部分中找到离零最远的部分。
标签: python list algorithm sorting divide-and-conquer