数据流中的中位数_JAVA_中等

数据流中的中位数

http://www.nowcoder.com/questionTerminal/9be0172896bd43948f8a32fb954e1be1

  • 维护一个低位堆,一个高位堆,保持高位堆不少于低位堆,且低位堆最多比高位堆少一
  • 如果高位堆比低位堆大1,则取高位堆最小值,否则取低位堆最大值和高位堆最小值的平均数
  • 而优先队列能维护一个大(小)根堆,保证在O(1)找出低位堆最大值和高位堆最小值
import java.util.*;
public class Solution {
    // 低位用大根堆
    PriorityQueue<Integer> low = new PriorityQueue(new Comparator<Integer>() {
        public int compare(Integer o1, Integer o2) {
            return o2.compareTo(o1);
        }
    });

    // 高位用小根堆
    PriorityQueue<Integer> high = new PriorityQueue();
    public void Insert(Integer num) {
        // 低位比高位少时增加低位
        if(low.size() < high.size()) {
            // 如果该数该进大根堆则置换出大根堆的数
            if(num > high.peek()) {
                high.offer(num);
                num = high.poll();
            }
            low.offer(num);
        // 否则增加高位
        } else {
            // 如果该数该进小根堆则置换出小根堆的数
            if(!low.isEmpty() && num < low.peek()) {
                low.offer(num);
                num = low.poll();
            }
            high.offer(num);
        }
    }

    public Double GetMedian() {
        return high.size() > low.size() ? (double)high.peek() : (high.peek() + low.peek()) / 2.0;
    }
}
全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务