前几天我采访了亚马逊。我无法回答其中一个问题让我满意。我在面试后试图得到答案,但到目前为止我还没有取得成功。这里是问题:O(n)复杂度子段中最大值的最小值...
你有一个大小为n的整数数组。您将获得参数k
,其中k < n
。对于阵列中大小为k
的连续元素的每个段,您需要计算最大值。您只需返回这些最大值的最小值。
例如给出1 2 3 1 1 2 1 1 1
和k = 3
答案是1
。
段将是1 2 3
,2 3 1
,3 1 1
,1 1 2
,1 2 1
,2 1 1
,1 1 1
。
每个段中的最大值是3
,3
,3
,2
,2
,2
,1
。
这些值中的最小值是1
因此答案是1
。
我想出的最佳答案是复杂度O(n log k)。我所做的是创建一个第一个k
元素的二叉搜索树,在树中获取最大值并将其保存在变量minOfMax
中,然后使用数组中的其余元素一次循环一个元素,删除第一个元素在二叉搜索树中的前一个分段中,将新分段的最后一个元素插入树中,获取树中的最大元素,并将其与minOfMax
进行比较,并将minOfMax
中的最小值留在这两者中。
理想的答案需要是复杂度O(n)。 谢谢。
很好的解决方案,但可怕的面试问题。要么你对这个数据结构很熟悉,而且这个问题是微不足道的;或者你不是,这个问题是不可能的。 (除非你想假装在面试过程中提出这个问题?)我想知道是否有更直接的方法,或者这只是一个蹩脚的面试问题。 – Nemo 2011-12-14 04:44:30
@ Nemo-我只知道如何解决这个问题,因为我知道最小队列数据结构,我只知道这一点,因为我花了四个小时试图弄清楚如何在看到基于最小叠加,这本身就是一个艰难的面试问题。我认为可能有更简单的方法来解决这个问题,但老实说,我不知道如何以其他方式解决这个问题。 – templatetypedef 2011-12-14 04:47:13