我在面试中被问到了这个问题。显然,我能够在O(n)的时间内解决它,但我无法想出一种在O(logn)时间内解决它的方法。听起来像是使用了一些分治算法,但我不确定。
def kth(array1, array2, k):
# Basic proof of concept. This doesn't handle a bunch of edge cases
# that a real implementation should handle.
# Limitations:
# Requires numpy arrays for efficient slicing.
# Requires k to be a power of 2
# Requires array1 and array2 to be of length exactly k
if k == 1:
return min(array1[0], array2[0])
mid = k//2 - 1
if array1[mid] > array2[mid]:
array1, array2 = array2, array1
return kth(array1[k//2:], array2[:k//2], k//2)
我已经测试过这个功能,但是还不太充分。
A = {1}
和 B = {2, 3}
,并尝试查找第二大的元素(应该是 2)。当你将 A 扩展为大小为两个元素 A = {1, ∞}
,将其在中心分成两半 {1 | ∞},然后删除 A 的右半部分和 B 的左半部分,你会得到 A = {1}
和 B = {3}
,它们的最小值为 1。 - 1110101001