首页 > 其他分享 >295. 数据流的中位数

295. 数据流的中位数

时间:2023-10-08 14:56:42浏览次数:33  
标签:int top 中位数 addNum que1 que2 数据流 MedianFinder 295

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

例如 arr = [2,3,4] 的中位数是 3 。
例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。
实现 MedianFinder 类:

MedianFinder() 初始化 MedianFinder 对象。

void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。


示例 1:

输入
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出
[null, null, null, 1.5, null, 2.0]

解释
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);    // arr = [1]
medianFinder.addNum(2);    // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3);    // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

代码


class MedianFinder {
private:
    //大顶堆
    priority_queue<int> que1;

    priority_queue<int,vector<int>,greater<int>> que2;
    
    int capacity;
public:
    //寻找中间索引
    MedianFinder() {
        capacity = 0;
    }
    
    void addNum(int num) {
        if(!que2.empty() && num >= que2.top()){
            que2.push(num);
        }else{
            que1.push(num);
        }
        if(que1.size() > que2.size()){
            int l = que1.top();que1.pop();
            que2.push(l);
        }else if(que1.size() < que2.size()){
            int r = que2.top();que2.pop();
            que1.push(r);
        }
        capacity++;
    }
    
    double findMedian() {
        int size1 = que1.size();
        int size2 = que2.size();
        if(capacity % 2 == 0){
            double l = que1.top();
            double r = que2.top();
            return (double)((l + r)/2);
        }else{
            if(size1 > size2){
                return que1.top();
            }else{
                return que2.top();
            }   
        }
    }
};

标签:int,top,中位数,addNum,que1,que2,数据流,MedianFinder,295
From: https://www.cnblogs.com/lihaoxiang/p/17749046.html

相关文章

  • P2951 [USACO09OPEN] Hide and Seek S 题解
    Problem题目概述给你一个无向图,边权都为\(1\),求:离\(1\)号点最远的点的编号、最远的距离、有几个点是离\(1\)号点最远的。思路直接用:优先队列\(BFS\),先求出\(1\)号点到每个点的最短路,存到\(dis\)数组中,然后再求\(max(dis[i])\),就搞定了。错误原因审题&做法错......
  • 应用程序读取磁盘的数据流程
    应用程序请求文件读取:用户态的应用程序发起文件读取请求,通常是通过标准的文件操作函数(例如,在Linux中是read(),在Windows中是ReadFile())系统调用:操作系统内核接收到应用程序的读取请求,这将触发一个系统调用(systemcall)。系统调用是用户态和内核态之间的通信机制,用于执行操......
  • mysql跑99分位、80分位、中位数的方法
    #分两步得到第一步假设得到的值为1000000SELECTFLOOR(COUNT(*)*0.99)FROM(selectcount(*)ascntfrommytablenamegroupbyuid)tmpb;#获取的第一个值即为99分位的数据SELECTcntFROM(selectuid,count(*)ascntfrommytablenamegroupbyuid)tmpaORDERB......
  • 软件设计师数据流图(答题技巧)
    第一题:找出实体实体分为:人、系统、物。*根据说明和顶层图可以能够迅速的找出实体。第二题:找出存储文件*1、首先根据第一题中找出的实体并在0层图中备注出来。2、根据说明和实体可以很快的找出文件所对应图中的位置。第三题:找出缺失的数据流此题要跟据三个方面查找......
  • 剑指 Offer 41. 数据流中的中位数
    classMedianFinder{public:/**initializeyourdatastructurehere.*///注意小根堆的定义方式priority_queue<int,vector<int>,greater<int>>up;//小根堆,默认放从大到小后一半的数priority_queue<int>down;//大根堆,默认放从小到大排序前一半......
  • HDU 2955 Robberies
    01背包银行总钱数==容量V概率可以算安全的概率p=1-p;#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;doublepp,p[10001],f[10001];intv[10001];intmain(){ intt; scanf("%d",&t); while(t--){ intn,j,i,k,sum......
  • 如何实现数据流畅转换?火山引擎ByteHouse推出ELT能力
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群在数据分析场景中,企业使用的数据通常具备来源多样化的特点,如支付交易记录、用户行为等,且数据格式各异,有的为行式存储结构,有的为列式存储结构。这就要求企业数仓具备一定的数据转换能力。传统方式......
  • 练习:分治算法--有序数组寻找中位数
    题:给定两个长度为m和n有序组数array1和array2,请找出这个有序数组的中位数。'''eg.[1,3]和[5,6],中位数是4[1,2,5,8,9]和[2,3,4,5],中位数是4'''###直接方法,使用内置排序函数sort#时间复杂度最高:O((n+m)log(n+m)),空间复杂度:O(n+m)1classSolution(object):2deff......
  • elastic索引管理-数据流
     8,数据流 数据流数据流允许您跨多个索引存储仅附加的时间序列数据,同时为您提供单个命名资源用于请求。数据流非常适合日志、事件、指标和其他连续生成的数据。您可以将索引和搜索请求直接提交到数据流。流自动将请求路由到存储流数据的支持索引。您可以使用索引生命周期管理(......
  • 题解 [CQOI2009] 中位数
    题目链接要想使得数字\(x\)是中位数,就必须选出\(k\)个小于\(x\)的数和\(k\)个大于\(x\)的数。我们考虑对数字附上特殊值,小于\(x\)的数赋值为\(-1\),大于\(x\)的数赋值为\(1\),\(x\)则赋值为\(0\),那么若一段包含\(x\)的连续序列的和等于\(0\),就可以说明这段连......