解题思路:
1、这道题的难点,一个是要读懂题的意思,现在懂了,well done~!
2、还可以,用堆把数组分成两半,这是我没有想到的!下次有意识用起来。
3、最后,insert的过程,是我没有注意到的,insert的num 是不确定大小的!!!,所以先统一入min堆后,再突出排列好的新元素,吐出到max堆,之后,偶数变基数个的时候,会导致max堆比min堆多一个,所以,做了重新平衡,这些都是为了最终取数据用的!
import java.util.*; public class Solution { // 最小堆,存右边较大值,方便获取最小值 PriorityQueue<Integer> max = new PriorityQueue<Integer>(); // 最大堆,存左边较小值,方便获取最大值 PriorityQueue<Integer> min = new PriorityQueue<>((o1, o2)->o2.compareTo(o1)); public void Insert(Integer num) { min.offer(num); //新数不确定大小,所以先放到左边的最大堆排序 max.offer(min.poll()); //新增一个元素后,min大小+1了,同时把最新的最大值吐出,给到最大堆 if(min.size() < max.size()) { //偶数个变基数个的时候,会导致右边队列比左边大,所以,又要再吐出来平衡 min.offer(max.poll()); } } public Double GetMedian() { if(min.size()> max.size()) { return (double) min.peek(); //奇数个的时候是不用除2的 } else { return (double) (max.peek()+min.peek())/2; //偶数个的时候要除2,不过注意点 //(max.peek()+min.peek())/2; 和 //((max.peek()+min.peek())/2) 结果不一样 // 多了一个括号,再转double会先被去掉小数部分 // 不加括号,就不会了! } } }