数据流中的中位数TitleDescription如何获取数据流中的中位数?如果从数据流中读取奇数个值,则中位数是所有排序值中间的值。如果从数据流中读取偶数个值,则中位数是所有值排序后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。题目链接:数据流中的中位数代码importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.PriorityQueue;/***标题:数据流中的中位数位数*标题描述*如何获取数据流中的中位数?如果从数据流中读取奇数个值,则中位数是所有排序值中间的值。如果从数据流中读取偶数个值,*那么中位数就是所有值排序后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。*问题链接:*https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&&tqId=11216&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking*/publicclassJz63{/*大顶堆,存储左半部分元素*/privatePriorityQueueleft;/*小顶堆,存放右半边元素,右半边元素大于左半边*/privatePriorityQueueright=newPriorityQueue<>();/*当前数据流读取的元素个数*/privateintN=0;publicJz63(){left=newPriorityQueue<>((o1,o2)->o2-o1);}publicvoidinsert(Integernum){/*插入保证两个堆是平的状态*/if(N%2==0){/*当N为偶数时插入到右半边。*因为右半部分的元素比左半部分大,但是新插入的元素不一定比左半部分的元素大,*所以需要先把元素插入左半部分,然后利用左半边是大顶堆的特点,取出堆顶元素为最大元素,插入右半边*/left.add(num);right.add(left.poll());}else{right.add(num);left.add(right.poll());}N++;}publicDoublegetMedian(){if(N%2==0){return(left.peek()+right.peek())/2.0;}else{return(double)right.peek();}}publicstaticvoidmain(String[]args){Listlist1=newArrayList<>();list1.add(2);list1.add(1);list1.add(5);列表1.添加(11);list1.add(4);for(intn:list1){System.out.print(n+"");}System.out.println();集合.sort(list1);for(intn:list1){System.out.print(n+"");}}}【每日留言】别羡慕别人,你的屌丝迟早会出现!