一尘不染

如何在两个排序数组的并集中找到第k个最小元素?

algorithm

这是一个作业问题。他们说这需要O(logN + logM)在哪里NM是数组的长度。

让我们命名的数组ab。显然,我们可以忽略所有a[i]b[i]其中i>ķ。
首先,我们比较a[k/2]b[k/2]。让b[k/2]> a[k/2]。因此,我们也可以舍弃所有b[i],其中i> k / 2。

现在我们有了all a[i],其中i <k和all b[i],其中i <k / 2来找到答案。

你下一步怎么做?


阅读 263

收藏
2020-07-28

共1个答案

一尘不染

您已掌握,继续前进!并注意索引…

为了简化一点,我假设N和M> k,所以这里的复杂度为O(log k),即O(log N + log M)。

伪代码:

i = k/2
j = k - i
step = k/4
while step > 0
    if a[i-1] > b[j-1]
        i -= step
        j += step
    else
        i += step
        j -= step
    step /= 2

if a[i-1] > b[j-1]
    return a[i-1]
else
    return b[j-1]

为了演示,您可以使用循环不变i + j = k,但我不会做所有作业:)

2020-07-28