arrays - 如何找到所有大小为 k 的子数组的第 n 个最小值/最大值(滑动窗口问题)
问题描述
有很多参考可以找到所有大小为 k 的子数组的最小值/最大值,但是如何以最佳方式找到第 n 个最大值/最小值。如果我们必须找到子数组的最小/最大值,那么我们可以使用具有线性时间复杂度的双端队列解决方案。但是对于第 n 个最小值/最大值,我无法找到解决方案。
注意:n<=k
示例:arr = {7,1,4,20,11,17,15} n=2, k=4
输出:4,4,11,15
解决方案
我相信您需要的数据结构是经过一点修改的二叉搜索树 (BST),其中每个节点还存储其子树的大小。
在 BST 中添加、删除元素或查找第 n 个元素都将变为log(K)
*。因此,当在数组上滑动窗口时,您有 3 个log(K)
操作,假设N
给定数组中的总元素,因此总时间复杂度为N*log(K)
.
- 你需要一个平衡的 BST(例如红黑树)来维持这个时间复杂度。如果您来自任何在线评委,例如 Codeforce 或 Hackerrank,请记住他们往往会提供会产生退化 BST 的输入。
推荐阅读
- json - Parsehub 网站元素仅在特定日期显示
- python - 发布表单已更改以查看
- r - ggtext:element_markdown 不适用于 position = "top"
- react-native - React Native CountdownCircleTimer 每秒重新渲染组件
- c# - 如何在赋值之前保留参考
- python - osx上的pytorch(仅限cpu)失败,找不到符号
- python - 如何制作一个自动更新python结果的画布文本?
- regex - 匹配除开头重复字母外的所有内容
- reactjs - 在不同的项目中使用相同的 Firebase 云功能
- node.js - 我可以在 MongoDB 中维护两个用户集合吗?