当前位置: 首页 > news >正文

算法通关村第十四关:黄金挑战-数据流的中位数

黄金挑战-数据流的中位数

1.数据流中中位数的问题

LeetCode295
https://leetcode.cn/problems/find-median-from-data-stream/

思路分析

中位数的问题,我们一般都可以用 大顶堆+小顶堆 来求解

小顶堆(minHeap):存储所有元素中较大的一半,堆顶元素是其中最小的数
大顶堆(maxHeap):存储所有元素中较小的一半,堆顶元素是其中最大的数

相当于,把所有元素分成了大和小两半,计算中位数,只需要大的那半的最小值和小的那半的最大值即可。

如[1,2,3,4,5],分成小顶堆[3,4,5],大顶堆[2,1],中位数为3

过程
加1 小顶堆[1] 大顶堆[] 中位数 1
加2 小顶堆[2] 大顶堆[1] 中位数 (2+1)/2
加3 小顶堆[2,3] 大顶堆[1] 中位数 3
加4 小顶堆[3,4] 大顶堆[2,1] 中位数 (3+2)/2
加5 小顶堆[3,4,5] 大顶堆[2,1] 中位数 3

代码实现

Java中的堆(即优先队列)可方便实现,c++、python里没有提供堆结构,需要自己构造

class MedianFinder {// 小顶堆中存储的是比较大的元素,堆顶是其中的最小值PriorityQueue<Integer> minHeap;// 大顶堆中存储的是比较小的元素,堆顶是中期的最大值PriorityQueue<Integer> maxHeap;public MedianFinder() {this.minHeap = new PriorityQueue<>();this.maxHeap = new PriorityQueue<>((a, b) -> b - a);}public void addNum(int num) {// 小顶堆存储的是比较大的元素,num大于小顶堆中根元素时进入minHeapif (minHeap.isEmpty() || num > minHeap.peek()){minHeap.offer(num);// 如果minHeap比maxHeap多2个元素,就平衡一下if (minHeap.size() - maxHeap.size() > 1){maxHeap.offer(minHeap.poll());}}else{maxHeap.offer(num);// 这样可以保证多的那个元素肯定在minHeapif(maxHeap.size() - minHeap.size() > 0){minHeap.offer(maxHeap.poll());}}}public double findMedian() {if(minHeap.size() > maxHeap.size()){return minHeap.peek();}else if(minHeap.size() < maxHeap.size()){return maxHeap.peek();}else{return (minHeap.peek() + maxHeap.peek())/2.0;}}
}/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder obj = new MedianFinder();* obj.addNum(num);* double param_2 = obj.findMedian();*/
http://www.lryc.cn/news/155262.html

相关文章:

  • 【2023集创赛】国家集创中心杯三等奖:不对称轻失配运算放大器
  • 手写Mybatis:第18章-一级缓存
  • 哈夫曼编码实现文件的压缩和解压
  • 解决六大痛点促进企业更好使用生成式AI,亚马逊云科技顾凡采访分享可用方案
  • Qt 定时器放在线程中执行,支持随时开始和停止定时器。
  • java 过滤器 接口(API)验证入参,验签(sign) Demo
  • 独家!微信正在灰测一款全新消金产品
  • 阿秀C++笔记-学习记录
  • 前端入门到入土?
  • 架构设计基础设施保障IaaS之网络
  • zabbix安装部署
  • 零碎的C++
  • 模糊测试面面观 | 模糊测试是如何发现异常情况的?
  • C#备份数据库文件
  • 行军遇到各种复杂地形怎么处理?
  • Python Number(数字).............................................
  • 设置 Hue Server 与 Hue Web 界面之间的会话超时时间
  • openGauss学习笔记-57 openGauss 高级特性-并行查询
  • 软考(1)-面向对象的概念
  • 深度学习推荐系统(四)WideDeep模型及其在Criteo数据集上的应用
  • 第十二章 YOLO的部署实战篇(中篇)
  • 面试题查漏补缺 i++和 ++ i哪个效率更高
  • Docker的数据管理(持久化存储)
  • 定时脚本自动自动将文件push到git
  • 025: vue父子组件中传递方法控制:$emit,$refs,$parent,$children
  • 使用js搭建简易的WebRTC实现视频直播
  • LeetCode 2707. Extra Characters in a String【动态规划,记忆化搜索,Trie】1735
  • 设计模式行为型-模板模式
  • 9.3.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-车道线检测
  • django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.