题解 | #数据流中的中位数#TOP48

思路:
1.暴力破解法,每次插入的时候,都for循环遍历找到num位置该存放的位置,然后插入
2.堆。用大根堆存放中位数左边的数,小根堆存放右边的数。大根堆的最大数小于小根堆的最小数
3.第一个数,先放入大根堆,然后再取出最大的数放在小根堆里。第二个数,先放入小根堆里,然后取出最小的数,放在大根堆里。第三个数,先放入大根堆,再取出最大的数,放入到小根堆。这种奇数位的数据,直接取小根堆的堆顶就可以了。偶数位那就两者平均。
4.每次存放数据时,做到将数据平均,所以有第1个数放到大根堆,取出来放到小根堆。第二个反之。每次先放再取,主要是取最小值和最大值

import java.util.*;

public class Solution {

    PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>(){
        @Override
        public int compare(Integer o1,Integer o2){
            return o2 - o1;
        }
    });
    int count = 0;
    
    public void Insert(Integer num) {
        
        if(count % 2 == 0){
            //已经偶数个 放到
            maxHeap.offer(num);
            int temp = maxHeap.poll();
            minHeap.offer(temp);
        }else{
            minHeap.offer(num);
            int temp = minHeap.poll();
            maxHeap.offer(temp);
        }
        count ++;
    }

    public Double GetMedian() {

        if(count % 2 == 0){
            return  new Double(minHeap.peek() + maxHeap.peek() ) / 2;
        }else{
            return new Double(minHeap.peek());
        }
    }


}
全部评论

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务