为什么选择算法失败:
请注意,在#elements 中使用选择算法是线性的。假设 #requests 在 #elements 中是线性的 - 这将导致二次解,这就是您超出时间限制的原因。
另一种方法:
维护两个堆:一个最大堆H1
和一个最小堆H2
最大堆 ( H1
) 将保存 2/3 的最低数字,而最小堆将保留 1/3 的最高数字。
现在,对于您读取的每个元素x
,检查是否需要增加顶部 1/3 堆 ( H2
),如果需要:您需要添加max{x,H1.max()}
. 如果您添加了H1.max()
- 您需要将其从堆中删除,然后插入x
。如果不需要添加,则检查是否x
大于 then H2.min()
,如果是,则删除 min 形式H2
,将其插入H1
,然后添加x
到H1
。
注意:您在此解决方案中查找的数字可以随时找到O(1)
,它是最小堆 ( H2
) 的最小值。
如果此解决方案的总复杂度是O(nlogn + k)
-n
数字的数量在哪里,并且k
是“告诉数字”请求的总数。
注意:一个更简单的解决方案(虽然可能更慢)是保持列表排序(例如在BST或跳过列表中),并使用二进制搜索来查找相关元素。
例子:
init:
H1 = {}
H2 = {}
input1:
H1 = {1}
H2 = {}
input7:
H1={1,7}
H2 = {}
input 9: //need to add a max, in this case: x > H2.max() -> add x to H2.
H1 = {1,7}
H2 = {9}
tell the number
H2.min() = 9
input 21: // 21>9 -> remove H2.min() add it to H1, add x to H2
H1 = {1,7,9}
H2 = {21}
input 8:
H1 = {1,7,8,9}
H2 = {21}
input 5: //remove max from H1, add max to H2, add x to H1
H1 = {1,7,5,8}
H2 = {9,21}
tell the number
H2.min() = 9
input 11: //remove min from H2, add it to H1, add x to H2.
H1 = {1,7,5,8,9}
H2 = {11,21}
tell the number
H2.min() = 11