堆排序问题

该博客介绍了如何利用大根堆和小根堆来实时计算数据流的中位数。通过创建两个堆,一个存储较小元素,另一个存储较大元素,保持堆的平衡,从而在任何时候中位数都可以从两个堆的顶部元素确定。文章详细展示了代码实现过程,并给出了关键操作的处理逻辑。
摘要由CSDN通过智能技术生成

NC随时找到数据流的中位数
思路:
1、准备一个大根堆,一个小根堆
2、一个新进来的数,如果比大根堆堆顶大,进小根堆;
比大根堆堆顶小,进大根堆
3、如果两个堆长度差2,弹出堆顶进对面堆
4、最后中位数必在两个堆顶中

//创建小根堆
 PriorityQueue <Integer> minHeap = new PriorityQueue<>();
 //创建大根堆
 PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2)->(o2-o1));
import java.util.*;
public class Solution {
    /**
     * the medians
     * @param operations int整型二维数组 ops
     * @return double浮点型一维数组
     */
    private PriorityQueue <Integer> minHeap = new PriorityQueue<>();
    private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2)->(o2-o1));
 
    public double[] flowmedian (int[][] operations) {
        // write code here
        ArrayList<Double> arr = new ArrayList<>();
       for(int[] op : operations){
         if(op[0]==1){
             if(maxHeap.isEmpty() || maxHeap.peek()>op[1]){
                 maxHeap.add(op[1]);
             }
             else{
                 minHeap.add(op[1]);
             }
 
             if(minHeap.size() == maxHeap.size()+2){
                 maxHeap.add(minHeap.poll());
             }
             if(minHeap.size()+2 == maxHeap.size()) {minHeap.add(maxHeap.poll());
             }
         }
         else{
             if(maxHeap.size()==0){
                 double ans=-1;
                 arr.add(ans);
                 continue;
             }
             if(maxHeap.size() == minHeap.size()){
                 double num1=maxHeap.peek();
                 double num2=minHeap.peek();
                 arr.add((num1+num2)/2);
             }
             else if(maxHeap.size() > minHeap.size()){
                 double num1 = maxHeap.peek();
                 arr.add(num1);
             }else{
                 double num1 = minHeap.peek();
                 arr.add(num1);
             }
         }
     }
     double[] arrs=new double[arr.size()];
     for(int i=0;i<arr.size();i++){
         arrs[i]=arr.get(i);
     }
     return arrs;
    }                              
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值