如何找到大小为k的所有子数组的第n个最小值/最大值(滑动窗口问题)

时间:2019-03-10 13:39:37

标签: arrays algorithm data-structures

关于找到大小为k的所有子数组的最小值/最大值的参考文献太多,但是如何以最佳方式找到第n个最大值/最小值。 如果只需要找到子阵列的最小/最大,则可以使用具有线性时间复杂度的双端队列解决方案。但是对于第n分钟/最大值,我无法找到解决方案。

注意:n <= k

示例: arr = {7,1,4,20,11,17,15} n = 2,k = 4

输出:4,4,11,15

1 个答案:

答案 0 :(得分:2)

我相信您需要的数据结构是经过稍微修改的二叉搜索树(BST),其中每个节点还存储了其子树的大小。

在BST中添加,删除元素或finding nth element都将变为log(K) *。因此,在将窗口滑动到数组上时,您有3个log(K)操作,假设给定数组中总共有N个元素,因此总的时间复杂度为N*log(K)

  • 您需要平衡的BST(例如红黑树)来维持此时间的复杂性。如果您来自Codeforce或Hackerrank之类的在线评委,请记住,他们经常会提供不生成简明BST的信息。