Q25_数据流中的中位数

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

package jianzhiOffer;

import java.util.Comparator;
import java.util.PriorityQueue;

public class Q25_数据流中的中位数 {

	class Solution {
		
		private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();	//默认是小顶堆
		private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11, new Comparator<Integer>() {
			
			//大顶堆需要反转默认的比较器
			@Override
			public int compare(Integer o1, Integer o2) {
				
				return o2.compareTo(o1);
			}
			
		});
		
		
		//添加元素num
		public void Insert(Integer num) {
		    
			//如果添加之后总元素个数为偶数个,将元素加到小顶堆中
			if((maxHeap.size() + minHeap.size() + 1) % 2 == 0) {
				//如果num的值小于大顶堆中的堆顶元素,将num添加到大顶堆中,并将大顶堆的堆顶元素移入小顶堆
				if(maxHeap.size() > 0 && num < maxHeap.peek()) {
					maxHeap.add(num);
					minHeap.add(maxHeap.poll());
				} else {
					//否则,直接添加到小顶堆中
					minHeap.add(num);
				}
			} else {
				//如果添加之后总元素个数为基数个,将元素加到大顶堆中
				//做同样的判断
				if(minHeap.size() > 0 && num > minHeap.peek()) {
					minHeap.add(num);
					maxHeap.add(minHeap.poll());
				} else {
					maxHeap.add(num);
				}
			}
	    }
		
		//获得中位数
	    public Double GetMedian() {
			
	    	if((minHeap.size() + maxHeap.size()) == 0) {
	    		return null;
	    	}
	    	
	    	double result;
	    	//总个数为偶数个
	    	if((minHeap.size() + maxHeap.size()) % 2 == 0) {
	    		result = (minHeap.peek() + maxHeap.peek()) / 2.0;
	    	} else {
	    		//总数为奇数个
	    		result = maxHeap.peek();
	    	}
	    	
	    	return result;
	    }
		
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值