思路:
其实用平衡树也可以直接解决该题, 但显然写平衡树太麻烦了.
维护一个大根堆和一个小根堆. 限制大根堆的大小为所求位次, 且大根堆的元素均小于等于小根堆的元素, 此时大根堆的堆顶即为所求位次的数,
具体来讲, 每次添加一个数时先加入大根堆中, 若此时大根堆的大小大于限制的大小, 则将堆顶元素加入小根堆并弹出. 限制大小增加时优先从小根堆的堆顶中取数.
此即所谓”对顶堆”, 即两个堆的堆顶”相对”, 从中间”分开”.
大概脑补一下就像这样:
代码:
1 |
|
其实用平衡树也可以直接解决该题, 但显然写平衡树太麻烦了.
维护一个大根堆和一个小根堆. 限制大根堆的大小为所求位次, 且大根堆的元素均小于等于小根堆的元素, 此时大根堆的堆顶即为所求位次的数,
具体来讲, 每次添加一个数时先加入大根堆中, 若此时大根堆的大小大于限制的大小, 则将堆顶元素加入小根堆并弹出. 限制大小增加时优先从小根堆的堆顶中取数.
此即所谓”对顶堆”, 即两个堆的堆顶”相对”, 从中间”分开”.
大概脑补一下就像这样:
1 | #include <cstdio> |