中位数问题(对顶堆的应用)
Leetcode295. 数据流的中位数
- 设计一个支持以下两种操作的数据结构:
- void addNum(int num) - 从数据流中添加一个整数到数据结构中。
- double findMedian() - 返回目前所有元素的中位数。
- 设计思路:维护两个堆:左侧大顶堆,用于维护比中位数小的元素;右侧小顶堆,用于维护比中位数大的元素;平均值:当两堆元素个数相同,则中位数为堆顶元素平均值;不同时为左侧大顶堆的堆顶值。插入元素时,两堆元素同样多则插入到左侧大顶堆(先插入右侧,弹出堆顶再插入左侧),不同时左侧多,插入到左侧弹出堆顶再插入到右侧。
- 注,less是大顶堆,greater是小顶堆!!!
1 | class MedianFinder { |
Leetcode480. 滑动窗口中位数
-
给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。
-
思路:对顶堆+延迟删除
1 | class DualHeap { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AFlyingSheep's Blog!
评论