【LeetCode每日一题】剑指 Offer 41. 数据流中的中位数(持续更新)

不要自卑,去提升实力
互联网行业谁技术牛谁是爹
如果文章可以带给你能量,那是最好的事!请相信自己
加油o~

2021/6/9

今日题目(剑指Offer系列)

剑指 Offer 41. 数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
例如,
[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]

解题思路:

>这道题目就是返回一个数据结构的中位数
>可以采用一个自动排序的数据结构
>这里我们采用的是两个堆,一个是大顶堆,一个是小顶堆
>Java中有个优先队列,底层是使用堆实现的,我们可以借助它
>在Python中存在heapq
>但是heapq中只是小顶堆,所以可以存储相反数伪造了大顶堆
>需要使用值得时候只需要再次取反即可

Python解法:

from heapq import *

class MedianFinder:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.A=[]
        self.B=[]

    def addNum(self, num: int) -> None:
        if len(self.A)!=len(self.B):
            heappush(self.B,-heappushpop(self.A,num))
        else:
            heappush(self.A,-heappushpop(self.B,-num))

    def findMedian(self) -> float:
        return (self.A[0]-self.B[0])/2.0 if len(self.A)==len(self.B) else self.A[0]

Java解法:

class MedianFinder {

    Queue<Integer> q1,q2;

    /** initialize your data structure here. */
    public MedianFinder() {
        q1=new PriorityQueue<Integer>();
        q2=new PriorityQueue<Integer>((x,y)->(y-x));
    }
    
    public void addNum(int num) {
        if(q1.size()!=q2.size()){
            q1.add(num);
            q2.add(q1.poll());
        }else{
            q2.add(num);
            q1.add(q2.poll());
        }
    }
    
    public double findMedian() {
        return q1.size()==q2.size() ? (q1.peek()+q2.peek())/2.0:q1.peek();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋 之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值