剑指Offer打卡day40—— AcWing 54. 数据流中的中位数

【题目描述】
在这里插入图片描述

【思路】
大根堆(maxHeap):存放较小的一半数字
小根堆(minHeap):存放较大的一半数字
如果数字个数为奇数个,那么大根堆存放的数字数量个数比小根堆多一
根据大小根堆的特点:

  1. 如果为奇数 那么中位数就是大根堆堆顶元素
  2. 如果是偶数 那么中位数就是大小根堆堆顶元素之和的一半
/**
大根堆(maxHeap):存放较小的一半数字
小根堆(minHeap):存放较大的一半数字
如果数字个数为奇数个,那么大根堆存放的数字数量个数比小根堆多一
根据大小根堆的特点:
1. 如果为奇数 那么中位数就是大根堆堆顶元素
2. 如果是偶数 那么中位数就是大小根堆堆顶元素之和的一半

 * */
class Solution {
    
    Queue<Integer> minHeap = new PriorityQueue<>(); //小根堆
	/** lambda写法
	
    Queue<Integer> maxHeap = new PriorityQueue<>(
        (x, y)->( y - x)        
    ); //大根堆
	*/
    Queue<Integer> maxHeap = new PriorityQueue<>(
        new Comparator<Integer>(){
            public int compare(Integer x, Integer y){
                return y - x;
            }
        }
            
    ); //大根堆
    
    
    public void insert(Integer num) {
        
        //先往大根堆加入该元素
        maxHeap.add(num);
        //维护有序性:即大根堆总是存放较小的一半数字
        //如果大根堆的堆顶元素大于小根堆的堆顶元素 则交换
        //小根堆可能为null
        if( !minHeap.isEmpty() && maxHeap.peek() > minHeap.peek() ){
            
            int a = maxHeap.poll(), b = minHeap.poll();
            maxHeap.add(b);
            minHeap.add(a);
        }
        //如果大根堆的元素比一半加一还多的话 将大根堆的堆顶弹出插入小根堆
        if( maxHeap.size()  > minHeap.size() + 1 )
            minHeap.add( maxHeap.poll() );
    }

    public Double getMedian() {
        
        int count  = minHeap.size() + maxHeap.size();
        
        if( (count & 1) == 1){
            return  (double) maxHeap.peek();
        } //奇数个
            
        else return (minHeap.peek() + maxHeap.peek()) / 2.0;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值