LeetCode 热题 100 -- 295.数据流的中位数
1、题目分析题目要求实现MedianFinder类构造函数可以将数据流中的整数num添加到数据结构中成员方法findMedian()可以返回到目前为止所有元素的中位数。要考虑到偶数个数和奇数个数的情况。中位数就是有序整数列表中的中间值那么要找出中位数就得保证已经存在的数是有序的或者说我们能保证当前存储所用的数据结构能使我们拿到大小排在正中间的数。对于这道题既然要想拿到中位数简单粗暴的方式是维护一个List列表每加入一个数就排序并计算中位数的索引并返回对应值但比较浪费资源并且效率低下。不过如果使用堆来解决就会高效很多。可以把已经输入的数据按照大小尽可能均匀的分成两组分别存在一个大顶堆和一个小顶堆。比方说现有数据有[2,3,1,6,3,5]那么小顶堆中存放较大的那一半的数[3,5,6]大顶堆存放较小的那一半数[1,2,3]。此时中位数就是小顶堆的堆顶元素与大顶堆堆顶元素的和的一半奇数个数的情况也是如此。2、代码实现大致思路就是这样那么看一下代码实现有了思路代码实现起来难度并不大需要注意的点在于存放数据的逻辑。当大小堆都为空时数据存入大顶堆也就是算入前半部分随后若值小于大顶堆的堆顶元素就也放入前半部分最后一定要平衡一下前半部分和后半部分的元素个数确保maxpq.size minpq.size 1 minpq.size maxpq.size也就是前半部分只能等于后半部分的数量或等于后半部分数量1。这样数据数量为奇数时直接返回maxpq的堆顶为偶数时返回(maxpq.peek minpq.peek) / 2.0即可。以下是提交记录3、总结这是Hot100中的最后一道堆相关的题目我们下一道题见