小编典典

子段中最大值的最小值…O(n)复杂度

algorithm

我几天前采访了亚马逊。我无法回答让我满意的一个问题。面试后我一直试图获得答案,但到目前为止我还没有成功。这是问题:

您有一个大小为n的整数数组。给您参数kwhere k < n。对于k数组中大小连续的元素的每个段,您需要计算最大值。您只需要返回这些最大值中的最小值。

例如给予1 2 3 1 1 2 1 1 1k = 3答案1
该段将是1 2 32 3 13 1 11 1 21 2 12 1 11 1 1
每个段中的最大的值是3332221
这些值的最小值就是1答案1

我想出的最好的答案是复杂度O(n log
k)。我要做的是用第一个k元素创建一个二分搜索树,获取树中的最大值并将其保存在变量中minOfMax,然后与数组中的其余元素一起循环一个元素,删除前一个元素中的第一个元素二进制搜索树中的段,将新段的最后一个元素插入树中,获取树中的最大元素,然后将其与minOfMax剩下minOfMax的最小值进行比较。

理想答案必须是复杂度O(n)。谢谢。


阅读 347

收藏
2020-07-28

共1个答案

小编典典

前面的问题
有关的方法非常聪明。这个想法是有可能在支持O(1)的时间内构建支持入队,出队和find-
max(执行此操作的方法有很多;在原始问题中有两种解释)。一旦有了此数据结构,就可以在O(k)时间中将数组中的前k个元素添加到队列中。由于队列支持O(1)find-
max,因此您可以在O(1)时间内找到这k个元素中的最大值。然后,将元素从队列中连续出队,并在O(1)时间内使下一个数组元素入队。然后,您可以在O(1)中查询每个k元素子数组的最大值。如果跟踪在整个阵列过程中看到的这些值的最小值,则可以使用O(n)时间,O(k)空间算法来查找k个元素子数组的最小最大值。

希望这可以帮助!

2020-07-28