思路:
前一半数用最大堆保存,后一半数用最小堆保存,并且最大堆的所有数小于最小堆的所有数,这样求中位数就是当最大堆最小堆堆顶的和的一半。
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> max = new ArrayList<Integer>();
ArrayList<Integer> min = new ArrayList<Integer>();
//插入数据流来的数
public void Insert(Integer num) {
if(max.size()==0)
max.add(0);
if(min.size()==0)
min.add(0);
//看是向哪个堆添加数据
if(max.size()==min.size())
{
if((min.size()==1)||(num<=min.get(1)))
insertMax(max,num);
else{
insertMax(max,min.get(1));
min.remove(1);
insertMin(min,num);
}
}
else{
if((max.size()==1)||(num>=max.get(1)))
insertMin(min,num);
else{
insertMin(min,max.get(1));
max.remove(1);
insertMax(max,num);
}
}
}
//得到中位数
public Double GetMedian() {
if((max.size()==1)&&(min.size()==1))
return 0.0;
else if((max.size()+min.size())%2==1)
return (double)max.get(1);
else
return ((double)(max.get(1)+min.get(1)))/2.0;
}
//交换两数
public void swap(ArrayList<Integer> a,int p1,int p2)
{
int temp = a.get(p1);
a.set(p1,a.get(p2));
a.set(p2,temp);
}
//在最大堆中添加数
public void insertMax(ArrayList<Integer> max,Integer num)
{
int i = max.size();
max.add(num);
while((i>1)&&(max.get(i)>max.get(i/2)))
{
swap(max,i,i/2);
i=i/2;
}
}
//在最小堆中添加数
public void insertMin(ArrayList<Integer> min,Integer num)
{
int i = min.size();
min.add(num);
while((i>1)&&(min.get(i)<min.get(i/2)))
{
swap(min,i,i/2);
i=i/2;
}
}
}