其中c++
有一个函数被调用std::nth_element
,它可以在线性时间内找到数组的第 n 个元素。使用此函数,您应该找到第N - n
- 个元素(其中N
是数组中元素的总数)并从中减去 1。
当您寻求解决方案时,C
您无法使用此功能,但您可以类似地实施您的解决方案。nth_element
执行与 qsort 非常相似的操作,但它仅对数组中第 n 个元素所在的部分执行分区。
现在让我们假设你已经nth_element
实现了。我们将执行类似二分搜索和nth_element
. 首先我们假设问题的答案是数组的中间元素(即第 N/2 个元素)。我们使用nth_element
并找到第N/2
th 个元素。如果它比N/2
我们知道的更多,那么您的问题的答案至少是N/2
,否则它会更少。无论哪种方式,为了找到答案,我们只会继续使用N/2
第 th 个元素创建的两个分区之一。如果这个分区是正确的(大于 的元素N/2
),我们继续解决相同的问题,否则我们开始搜索第一个元素M
左侧的最大元素,该N/2
元素至少具有x
更大的元素,使得x + N/2 > M
. 这两个子问题将具有相同的复杂性。您继续执行此操作,直到您感兴趣的间隔为 length 1
。
现在让我们证明上述算法的复杂度是线性的。第一个nth_element
是按 的顺序线性执行操作N
,第二个nth_element
是只考虑数组的一半将按N/2
第三个顺序执行操作 -N/4
依此类推。总而言之,您将按N + N/2 + N/4 + ... + 1
. 这个总和小于2 * N
因此您的复杂性仍然是线性的。
您的解决方案比我上面建议的要慢,因为它具有复杂性O(n*log(n))
,而我的解决方案具有O(n)
.