做竞争小的网站宁波网
news/
2025/10/4 2:03:07/
文章来源:
做竞争小的网站,宁波网,百度推广点击收费标准,全屏网站模板制作教程数据流中中位数的问题 LeetCode295,中位数是有序列表中间的数。如果列表长度是偶数#xff0c;中位数则是中间两个数的平均值。 例如#xff1a;[2,3,4]的中位数是3 [2,3]的中位数是(23)/22.5 实现 MedianFinder 类:
MedianFinder() 初始化 MedianFinder 对象。void addNum(…
数据流中中位数的问题 LeetCode295,中位数是有序列表中间的数。如果列表长度是偶数中位数则是中间两个数的平均值。 例如[2,3,4]的中位数是3 [2,3]的中位数是(23)/22.5 实现 MedianFinder 类:
MedianFinder() 初始化 MedianFinder 对象。void addNum(int num) 将数据流中的整数 num 添加到数据结构中。double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。 分析这是一道比较难的题目了如果没专门学过很难在面试时想到。 中位数的题我们一般都可以用大顶堆小顶堆来求解下面我们通过直观的例子解释一下怎么做。 小顶堆(minHeap)存储所有元素中较大的一半堆顶存储的是其中最小的数。 大顶堆(maxHeap):存储所有元素中较小的一半堆顶存储的是其中最大的数。 相当于把所有元素分成了大和小两半而我们计算中位数只需要大的那半的最小值和小的那半的最大值即可。比如我们依次添加[1,2,3,4,5]砍成两半之后为[1,2]和[3,4,5]我们只要能快速的找到2和3即可。 下面看看使用两个堆它们是怎么变化的 1.添加1进入到minHeap中中位数为1 2.添加2它比minHeap堆顶元素1大进入minHeap,同时minHeap中元素超过了所有元素总和的一半所以要平衡一下分一个给maxHeap,中位数为(12/2.01.5 添加3它比minHeap堆顶元素2大进入minHeap,中位数为2 添加4它比minHeap堆顶元素2大进入minHeap,同时minHeap中元素超过了所有元素总和的一半所以要平衡一下分一个给maxHeap,中位数为(23)/2.02.5 5.添加5它比minHeap堆J顶元素3大进入minHeap,中位数为3 Java中的堆即优先级队列是使用完全二叉树实现的我们这里的图也是以完全二叉树为例。理解了上述的过程看代码就比较简单了 代码如下
class MedianFinder {PriorityQueueInteger queleft;PriorityQueueInteger queright;public MedianFinder() {queleft new PriorityQueueInteger((a, b) - (b - a));//中位数左边是大顶堆queright new PriorityQueue();//中位数右边是小顶堆}public void addNum(int num) { //添加元素if(queleft.isEmpty() || num queleft.peek()){queleft.offer(num);if(queleft.size() queright.size() 1){ //queleft最多比queright多一个元素queright.offer(queleft.poll());}}else{queright.offer(num);if(queright.size() queleft.size()){queleft.offer(queright.poll());}}}public double findMedian() { if(queleft.size() queright.size()){//奇数情况return 1.0 * queleft.peek();}else return (queleft.peek() queright.peek()) / 2.0;}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926509.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!