假设我们有n(1 <= n <= 10 ^ 3)个大小为A1,A2,......的分类数组。 (1 << =艾&LT = 10 ^ 3)。我们需要将唯一组合中的第k个最小整数归类为这些数组。是否有一种有效的方法来执行此操作,复杂度小于O(A1 + A2 .. + An)?
可以解决类似于二分搜索的问题吗?
PS:我这里有similar problem,但无法理解如何为独特元素扩展它。
编辑1:我想你们有些人误解了这个问题。我们举一个例子: N = 3,
A1 = 1,1,3,3
A2 = 6,7,9
A3 = 1,6,8
上述数组的独特组合是{1,2,3,6,7,8,9}。现在假设我想要第二个元素它应该返回2而第四个元素它应该返回6。
答案 0 :(得分:1)
可以O(k n log n)
:
k
次:
q
并记住它q
。q
的相应数组Python代码:
import heapq
import bisect
def kth(A, k):
h = []
for idx,a in enumerate(A):
if len(a) > 0:
heapq.heappush(h, (a[0], idx))
for i in xrange(k):
if len(h) == 0:
return None
val, _ = h[0]
while (len(h) > 0) and (h[0][0] == val):
_, idx = heapq.heappop(h)
nxt = bisect.bisect_right(A[idx], val)
if nxt < len(A[idx]):
heapq.heappush(h, (A[idx][nxt], idx))
if len(h) > 0:
return h[0][0]
return None
答案 1 :(得分:0)
是否有空间要求,或者数组中的数字是否可以重复?
如果没有,您可以创建2个有序集:唯一和非唯一。 添加数组时,循环遍历数组并将其数字添加到2个有序集中,如下所示:
然后,您可以立即在排序的唯一身份集中查找第k个最小数字。