具有最大最小元素的固定长度的连续子序列

时间:2014-09-06 21:37:51

标签: algorithm data-structures

给出数字和数字的序列n    K,1< = K< = n,我们想要找到长度为K的连续子序列    使得子序列中的最小元素尽可能大。

我已经能够在O(n * log(k))时间内通过将当前k个元素保持在二叉树中并且在迭代数组时分别添加和删除下一个和第一个元素来实现它。我怎么能在O(n)中做到?

2 个答案:

答案 0 :(得分:4)

保持包含(按顺序)窗口中元素小于窗口中所有后续元素的双端队列。在任何时候,窗口最小值都在双端队列的前面。要向前扩展窗口:从双端队列背面弹出大于或等于新元素的元素。将新元素推到背面。要向前缩回窗口:如果双端队列前面的元素索引即将离开窗口,请将其删除。

每一步维持双端队列的摊销成本为O(1)。 (A real-time algorithm also is possible.

答案 1 :(得分:0)

你可以在O(n)时间内完成。 1)i = 0 2)从第一个K元素中找出最小值并存储序列的起点和终点。 3)检查K + i位置的元素是否小于最小值 然后开始++,结束++ 4)如果数组未结束,则转到步骤3。 这个算法不是用正确的写作风格编写的,但你可以很容易理解。