双堆1.数据流的中位数
数据流中的中位数
有一个数据流一直输入字符,用insert方法插入数据,用另一个方法获得中位数。这个题的做法就是构建堆结构,一个为最小堆,一个为最大堆,因为数组的长度是变化的,所以直接用优先级队列吧。
插入之后保证最小堆的数全部大于最大堆,且两边数目不能相差超过1。所以如果现在个数为偶数,则下一个插入最大堆,那怎么保证此时插入的数据小于全部的最小堆呢,就是先把数据插入最小堆,返回堆顶之后再插入最大堆。如果此时个数为奇数,说明上一个一定插入的是最大堆,则现在要插入最小堆,怎么做和上面类似
获得中位数的时候就是如果个数为奇数返回最小堆堆顶,如果个数为偶数,则返回两个堆顶之和,注意这里返回的时候要先利用new Double变成double类型之后再除以2。
此时得到中位数的复杂度为O(1),插入复杂度为O(logn)
import java.util.PriorityQueue;
import java.util.Comparator;
public class Solution {PriorityQueue<Integer> smallP=new PriorityQueue<Integer>((Integer a,Integer b)->{return a-b;});//其实默认就是小顶堆,试一下拉姆达表达式 PriorityQueue<Integer> bigP=new PriorityQueue<Integer>(new Comparator<Integer>(){public int compare(Integer a,Integer b){return b-a;}});int count=0;public void Insert(Integer num) {if((count&1) ==1){smallP.offer(num);num=smallP.poll();bigP.offer(num);count++;}else{bigP.offer(num);num=bigP.poll();smallP.offer(num);count++;}}public Double GetMedian() {if((count&1) ==1){//因为插的时候是如果为偶数则插到小顶堆,所以弹出也是小顶堆.return new Double(smallP.peek());}else{return new Double(bigP.peek()+smallP.peek())/2;}}}
双堆1.数据流的中位数相关推荐
- 堆实战(动态数据流求top k大元素,动态数据流求中位数)
动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可当来的元素(newCome)> 堆顶元素(smallTo ...
- LeetCode 295. 数据流的中位数(大小堆)
文章目录 1. 题目 2. 大小堆解题 1. 题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 ...
- 一道简约而不简单的算法题——数据流的中位数 | 附动画解析
作者 | 程序员小吴 转载自微信公众号(ID:CXYxiaowu) 题目来源于 LeetCode 上第 295 号问题:数据流的中位数.难度级别为 Hard,目前通过率为 33.5% . 题目描述 中 ...
- 295. 数据流的中位数
295. 数据流的中位数 欢迎大家参加每日一题系列并提供其他版本,在你也可以按照相同格式提供你的最新的每日一题题解. 每日一题系列 题目描述: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是 ...
- Leetcode 295. 数据流的中位数
1.题目要求 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个 ...
- LeetCode 295. 数据流的中位数 Hard难度
295. 数据流的中位数 题目: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 ...
- [LeetCode][C++]数据流的中位数
数据流的中位数 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一 ...
- R语言使用epiDisplay包的aggregate.plot函数可视化每个子集的汇总统计信息(可视化基于双变量分组下的中位数及其95%置信区间、病例组和对照组的差异)、lwd参数自定义线条的粗细宽度
↵ R语言使用epiDisplay包的aggregate.plot函数可视化每个子集的汇总统计信息(可视化基于双变量分组下的中位数及其95%置信区间.基于线图可视化病例组和对照组的差异).lwd参数自 ...
- 76. Leetcode 295. 数据流的中位数 (堆-技巧一-固定堆)
技巧一 - 固定堆这个技巧指的是固定堆的大小 k 不变,代码上可通过每 pop 出去一个就 push 进来一个来实现.而由于初始堆可能是0,我们刚开始需要一个一个 push 进堆以达到堆的大小为k,因 ...
最新文章
- webpack4.0打包优化策略(二)
- 翻译: Oralce官方文档-- Data Blocks, Extents, and Segments
- mysql 执行计划不对_关于mysql主从查询执行计划不一致问题的分析
- linux ubuntu fadora,两大主流Linux版本Ubuntu 18.04和Fedora 28的对比
- Scala入门到精通——第二十四节 高级类型 (三)
- acwing2041. 干草堆(差分数组)
- jstring转换到C语言所用的char
- mysql基础之日志管理(查询日志、慢查询日志、错误日志、二进制日志、中继日志、事务日志)...
- 一位全减器逻辑电路图_一种一位全减器电路的制作方法
- 龙蜥开发者说:我眼里的龙蜥社区:一个包容的大家庭 | 第 10 期
- 飞翔 noip提高组难度
- 【Linux c】sipc
- linux下光模块信息命令,华为交换机查看光模块信息命令
- 基于qt linux的视频监控,基于Qt和OpenCV的无线视频监控系统
- 03.先了解一些python的基础语法
- Tensorlow 中文API:tf.zeros() tf.ones()tf.fill()tf.constant()
- TP5 在西部数码虚拟主机下 要如何实现伪静态
- ChatGPT所代表的人工智能的意义
- QTableView和QTableWidget的区别是什么?
- 查询客户时,提示“查询已超出200行,请限制查询“