【发布时间】:2020-03-19 18:24:09
【问题描述】:
考虑一个值数组{3,2,8,4,7,6,1}。我需要一个算法来找到每个长度为 K 子数组中的第 L 个最大/最小。
例如,对于上面的数组,设K = 5,L = 3。我需要找到每个长度为K的子数组的第3个最小值。
预期输出:
Subarray:
[3,2,8,4,7] = Third minimun is 4.
[2,8,4,7,6] = Third minimum is 6.
[8,4,7,6,1] = Third mininum is 6.
请帮我找到算法。
【问题讨论】:
-
我最初认为是自平衡 BST,但在它的中序遍历中找到 Lth min/max 时会是 O(L)。因此,对于大小为 k 的窗口,这可能是最小堆和最大堆的组合,我们在最小堆中保留 L-1 个元素,在最大堆中保留 L-K 个元素。因此,获得 Lth min/max 将是 O(1)。
-
@vivek_23 通过使用以该节点为根的子树的大小来扩充每个节点,将 BST 转变为顺序统计树。然后,在 O(log k) 中找到订单统计信息
-
@Dave 是的,有道理。
-
@vivek_23 何时使用最小堆和最大堆,何时向堆中添加新元素以及何时从堆中提取最小值和最大值。你能把伪代码分享给我吗?
-
@Raj 在线查找如何找到整数流的运行中位数。您的问题看起来与此类似。