leetcode295解法:

class MedianFinder {

private PriorityQueue<Integer> large;

private PriorityQueue<Integer> small;

public MedianFinder() {

// 小顶堆,poll取出的是堆中最小值。java中默认的PriorityQueue时小顶堆

large = new PriorityQueue<>();

// 大顶堆,poll取出的是堆中最大值。注意:return b-a;改变顺序成为大顶堆,因为默认a-b时升序,b-a降序,降序的一个优先队列也就是大顶堆。

small = new PriorityQueue<>((a, b) -> {

return b - a;

});

}

public double findMedian() {

// 如果元素不一样多,多的那个堆的堆顶元素就是中位数

if (large.size() < small.size()) {

return small.peek();

} else if (large.size() > small.size()) {

return large.peek();

}

// 如果元素一样多,两个堆堆顶元素的平均数是中位数

return (large.peek() + small.peek()) / 2.0;

}

//不仅要维护large和small的元素个数之差不超过 1,还要维护large堆的堆顶元素要大于等于small堆的堆顶元素

//small中的元素全部小于等于large,即large堆poll的最小值大于等于small堆poll的最大值

public void addNum(int num) {

if (small.size() >= large.size()) {//想要往large里添加元素,不能直接添加,而是要先往small里添加,然后再把small的堆顶元素加到large中;向small中添加元素同理。

small.offer(num);

large.offer(small.poll());

} else {

large.offer(num);

small.offer(large.poll());

}

}

}

/**

* Your MedianFinder object will be instantiated and called as such:

* MedianFinder obj = new MedianFinder();

* obj.addNum(num);

* double param_2 = obj.findMedian();

*/

leetcode之大顶堆和小顶堆相关推荐

  1. 大顶堆,小顶堆——排序问题

    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例如, [2 ...

  2. 堆排序之 大顶堆和小顶堆 c语言

    百度得到的堆定义如下: 堆的定义如下:n个元素的序列{k1,k2,ki,-,kn}当且仅当满足下关系时,称之为堆. (ki <= k2i,ki <= k2i+1)或者(ki >= k ...

  3. 谈谈堆排序,大顶堆,小顶堆

    目录 1.前言 2.使用堆的原因 3.堆的特点 4.堆和普通树的区别 5.堆排序的过程 6.堆排序的代码实现 来源: jianshu.com/p/15a29c0ace73 1.前言 堆是一种非线性结构 ...

  4. NO29、最小的K个数(应该记住大顶堆和小顶堆的区别与联系,并不难)

    29.最小的K个数 应该记住大顶堆和小顶堆的区别与联系,并不难 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 示例1 输入 ...

  5. 堆排序:大顶堆和小顶堆 + 前K个高频元素

    堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...

  6. C++大顶堆和小顶堆

    C++大顶堆和小顶堆 原理 大顶堆 小顶堆 大顶堆和小顶堆对比图 大顶堆和小顶堆的实现代码 vector和push_heap.pop_heap实现堆 建堆 调整堆 priority_queue实现堆 ...

  7. 堆排序(浅谈大顶堆与小顶堆)

    什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被看作一个完全二叉树,通俗来讲堆其实就是利用完全二叉树的结构来维护的一维数组,按照堆的特点可以把堆分为大顶堆 ...

  8. 大顶堆和小顶堆-java

    一.大顶堆和小顶堆的原理 1.大顶堆 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大顶堆.大根堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值. 2.小 ...

  9. c语言标准模板小顶堆,堆排序(大顶堆、小顶堆)----C语言

    堆排序 之前的随笔写了栈(顺序栈.链式栈).队列(循环队列.链式队列).链表.二叉树,这次随笔来写堆 1.什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被 ...

  10. 用Java实现二叉堆、大顶堆和小顶堆

    先了解了解 什么是二叉堆 二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树.在二叉树建树时采取前序建树就是建立的完全二叉树.也就是二叉堆.所以二叉堆的建堆过程理论上讲和前序建树一样. 什么是大顶 ...

最新文章

  1. 做三年地方网站不如别人打一场麻将
  2. AI与BCI相结合读取大脑数据,根据个人喜好生成图像
  3. python 微信_wxpy: 用 Python 玩微信
  4. mysql安装笔记02
  5. eclipse扩展点_Eclipse扩展点评估变得容易
  6. 工程师已经被虐到不行不行的了
  7. sink的简历(2011-6-20),寻工作一份
  8. linux通过vnc掉出浏览器,VNC远程Linux桌面控制好用 --尤其是用浏览器
  9. my batis plus 小数没有0_北师大版五年级第一单元小数除法知识点总结及易错题解析(1)...
  10. DataSnap服务器从xe2升级到xe5报错的处理
  11. 关于Union,Struct and Class的大小计算问题
  12. 老美,人不能无耻到这种地步
  13. matlab求解联名方程组带三角函数的,matlab三角函数方程组
  14. Unity HDRP中代码动态修改天空盒以及其他环境参数
  15. 2021年山西省粮食种植面积增长,夏粮获大丰收,但因秋粮遭遇自然灾害粮食产量下降[图]
  16. FPGA组合逻辑训练-三八译码器
  17. ACM题目和培养训练!!!
  18. 【条码检测算法】不起眼的条码识别也能玩出这么多花样
  19. H5/C3基础(2)
  20. 计算机专业教务工作总结,计算机系阶段工作总结

热门文章

  1. Spring boot+Shiro+ spring MVC+swagger UI +Mybatis+mysql+Vue +Element UI 之二 vue 环境演示
  2. hbuilderx 配置mumu模拟器,并运行app项目到模拟器
  3. 苹果MAC视网膜屏pyautogui的坐标转换
  4. 两边向中间打印(C语言)
  5. debian安装ssh服务
  6. 和cesuim类似的三维GIS平台_GIS基础软件新技术论坛在线举办,新技术你怎么这么酷!...
  7. html圆点跟链接线,html5 canvas简洁的圆点线动画特效
  8. java pkcs7 签名_签名验证(格式为PKCS#7)
  9. php安装后检测不成功,apache无法解析php
  10. 如何使win10避免自动删除程序文件(疑似病毒),且使该文件能运行