首页 > 其他分享 >力扣---剑指 Offer 41. 数据流中的中位数

力扣---剑指 Offer 41. 数据流中的中位数

时间:2023-04-04 12:34:58浏览次数:45  
标签:addNum Offer queue1 queue2 中位数 41 --- len2 findMedian

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

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例 1:

输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]
示例 2:

输入:
["MedianFinder","addNum","findMedian","addNum","findMedian"]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]
 

限制:

最多会对 addNum、findMedian 进行 50000 次调用。
注意:本题与主站 295 题相同:https://leetcode-cn.com/problems/find-median-from-data-stream/

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

当前已经插入的数可以分为两部分,一部分是小于等于当前中位数的元素,另一部分是大于等于当前中位数的元素。

两部分的特点是差值不超过一(由中位数的定义可得)

可以想到利用两个优先队列,一个从小到大存储所有比当前中位数小的数,一个从大到小存储所有比当前中位数大的数。

此时的中位数即是两个优先队列中元素较多的那个的堆顶(或者当两者元素数量相等时,是两者堆顶元素和的二分之一)

代码如下:

class MedianFinder {
    // queue1 中的元素数量
    private int len1 = 0;
    // queue2 中的元素数量
    private int len2 = 0;
    // 存储所有比中位数小的数
    private final Queue<Integer> queue1;
    // 存储所有比中位数大的数
    private final Queue<Integer> queue2;

    /** initialize your data structure here. */
    public MedianFinder() {
        // 堆顶是最大的数。
        queue1 = new PriorityQueue<>((a, b) -> (b - a));
        // 堆顶是最小的数
        queue2 = new PriorityQueue<>((a, b) -> (a - b));
    }

    public void addNum(int num) {
        // 将 num 插入到 queue1 或 queue2 中。
        if (queue2.peek() == null || num > queue2.peek()) {
            queue2.add(num);
            len2 ++;
        } else {
            queue1.add(num);
            len1 ++;
        }
        // 维护 queue1 中的元素个数和 queue2 中的元素个数相差不超过 1 。
        while (len1 > len2 + 1) {
            queue2.add(queue1.poll());
            len1 --;
            len2 ++;
        }
        while (len2 > len1 + 1) {
            queue1.add(queue2.poll());
            len2 --;
            len1 ++;
        }
    }

    public double findMedian() {
        // 如果元素数相同,直接返回两个堆顶和的二分之一
        if (len1 == len2) {
            return (queue1.peek() + queue2.peek()) / 2.0;
        } else if (len1 > len2) {
            return queue1.peek();
        } else {
            return queue2.peek();
        }
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

 

标签:addNum,Offer,queue1,queue2,中位数,41,---,len2,findMedian
From: https://www.cnblogs.com/allWu/p/17286006.html

相关文章

  • 实验一-密码引擎-加密API研究
    实验一-密码引擎-加密API研究API:应用程序接口(API:ApplicationProgramInterface)是一组定义、程序及协议的集合,通过API接口实现计算机软件之间的相互通信。API的一个主要功能是提供通用功能集。程序员通过使用API函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。......
  • golang CVE-2016-2183漏洞,https需要添加tls设置加密算法CipherSuites白名单,将弱加密算
    golangCVE-2016-2183漏洞,https需要添加tls设置加密算法白名单,将弱加密算法DES和3DES去掉。服务端样例代码packagemainimport("crypto/tls""fmt""net/http")funchandler(writerhttp.ResponseWriter,request*http.Request){fmt.Fprintf(wri......
  • Three.js 进阶之旅:全景漫游-初阶移动相机版
    Three.js进阶之旅:全景漫游-初阶移动相机版 声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。摘要3D 全景技术可以实现日常生活中的很多功能需求,比如地图的街景全景模式、数字展厅、在线看房、社交......
  • 代码随想录Day20-Leetcode654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验
    654.最大二叉树题目链接:https://leetcode.cn/problems/maximum-binary-tree/基本的模拟思路很快/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undefined?0:val)*this.left=(left===undefined......
  • [BUUCTF]PWN-bjdctf_2020_babystack2
          这题比较简单,注意无符号字符串变为负数之后会发生溢出即可pro.symbols是输出函数地址的意思r.recvuntil的使用是接收到字符串为止,然后将接受的数据返回为什么会有两个payload是因为我想使用这种方式看看行不行为什么是0x10,是因为main函数里不能大于10......
  • Excel 如何计算项目完成时间占全年百分比 - 小技巧
    一、新建“项目记录表”数据表,含有“项目名称”、“开始时间”及“结束时间”等信息,我们现在需要计算出项目所需要的时间占全年的百分比。如图所示二、单击选中“结束时间”右边的单元格并输入“占全年时间的百分比”,然后按住鼠标左键往下拉到表格底部。选中该列,如图所示:三......
  • 软件著作权申请-注意事项(微信小程序)
    开发的硬件环境:PC电脑内存:8GCPU:i565003.2GHz硬盘:1T显卡:GTX1080ti运行的硬件环境:安卓手机开发该软件的操作系统:Windows10专业版软件开发环境/开发工具:UnityC#VisualStudio该软件的运行平台/操作系统:安卓操作系统5.0及以上软件运行支撑环境/支持软......
  • 一手遮天 Android - view(媒体类): 截图
    项目地址https://github.com/webabcd/AndroidDemo作者webabcd一手遮天Android-view(媒体类):截图示例如下:/view/media/ScreenshotDemo1.kt/***截图*/packagecom.webabcd.androiddemo.view.mediaimportandroid.graphics.Bitmapimportandroid.graphics.Can......
  • 实验一-密码引擎-加密API研究
    实验一-密码引擎-加密API研究API:应用程序接口(API:ApplicationProgramInterface)是一组定义、程序及协议的集合,通过API接口实现计算机软件之间的相互通信。API的一个主要功能是提供通用功能集。程序员通过使用API函数开发应用程序,从而可以避免编写无用程序,以减轻编程任务。......
  • 一手遮天 Android - view(媒体类): MediaPlayer(在 SurfaceView 上播放)
    项目地址https://github.com/webabcd/AndroidDemo作者webabcd一手遮天Android-view(媒体类):MediaPlayer(在SurfaceView上播放)示例如下:/view/media/MediaPlayerDemo1.kt/***MediaPlayer(在SurfaceView上播放)**注:无法对SurfaceView截图,如果需要对视频截图......