剑指offer62-数据流中的中位数

在这里插入图片描述
此题用堆来做比较简单。
在这里插入图片描述
左边放一个大顶堆 右边放一个小顶堆
当有新数据来的时候,两个堆循环着放。
例如第一个数据,我们放到大顶堆,但是要注意,这个新的数据假如比小顶堆的最小值大,就要交换该数据和小顶堆的头部,让新数据成为小顶堆头部,原来的头部放到大顶堆中。
下一个数据放到小顶堆,但是要注意,如果这个新的数据比大顶堆的最大值小,就要交换。

import java.util.*;
public class Solution {

    private PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2)->o2-o1);
    private int count = 0;

    public void Insert(Integer num) {
        //一个放大顶堆  一个放小顶堆
        if(count%2==0){ //放在小顶堆
            //如果插入的数字比大顶堆的元素小
            if(!maxHeap.isEmpty()&&maxHeap.peek()>num){ //让大顶堆的头和这个数字交换位置
                int oldmax = maxHeap.poll();
                maxHeap.add(num);
                num = oldmax;
            }
            //更新之后的num放在小顶堆
            minHeap.add(num);
        }else{ //往大顶堆插
            if(!minHeap.isEmpty()&&minHeap.peek()<num){
                int oldmin = minHeap.poll();
                minHeap.add(num);
                num = oldmin;
            }
            maxHeap.add(num);
        }
        count++;
    }

    public Double GetMedian() {
        int size = minHeap.size()+maxHeap.size();
        if(size==0){
            return 0.0;
        }
        if(size%2==0){
            return (minHeap.peek()+maxHeap.peek())/2.0;
        }
        else{
            return Double.valueOf(minHeap.peek());
        }
    }


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值