18.9 随机生成一些数字并传入某个插入方法。 编写一个程序,高效地插入过的元素的维护中位数。
2014-08-26 17:07
776 查看
按照题意,要实现两个方法: addNewNumer(int num) 和 getMedian()
维护两个priority queue:maxHeap 和 minHeap。
maxHeap中存放小于中位数的元素,minHeap中存放大于中位数的元素。并且保证两个堆里元素数量相等或者max比min多一个。
维护两个priority queue:maxHeap 和 minHeap。
maxHeap中存放小于中位数的元素,minHeap中存放大于中位数的元素。并且保证两个堆里元素数量相等或者max比min多一个。
import java.util.Comparator; import java.util.PriorityQueue; public class Median { PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(10, new Comparator<Integer>() { public int compare(Integer x, Integer y) { return y.compareTo(x); } }); PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); public void addNewNumber(int num) { if (maxHeap.size() == minHeap.size()) { if (!minHeap.isEmpty() && num > minHeap.peek()) { maxHeap.add(minHeap.remove()); minHeap.add(num); } else { maxHeap.add(num); } } else { if (num < maxHeap.peek()) { minHeap.add(maxHeap.remove()); maxHeap.add(num); } else { minHeap.offer(num); } } } public double getMedian() { if (maxHeap.isEmpty()) return 0; if (maxHeap.size() == minHeap.size()) return (double) (minHeap.peek() + maxHeap.peek()) / 2; else return maxHeap.peek(); } public static void main(String[] args) { Median m = new Median(); m.addNewNumber(1); System.out.println(m.getMedian()); m.addNewNumber(3); System.out.println(m.getMedian()); m.addNewNumber(4); System.out.println(m.getMedian()); m.addNewNumber(5); System.out.println(m.getMedian()); m.addNewNumber(2); System.out.println(m.getMedian()); } }
相关文章推荐
- 程序员面试金典——解题总结: 9.18高难度题 18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
- 随机生成一些数字并传入某个方法。编写一个程序,每当收到新字符数字时,找出并记录中位数。
- 随机生成一些数字并传入某个方法,每当接收到新数字的时候,找出并记录中位数
- 随机产生一些数传递给一个函数,写程序找出并维护这些数的中位数。
- 编写程序,生成一个包含20个随机整数的列表,然后对其中偶数下标的元素进行降序排列,基数下标的元素不变
- 编写一个生成随机字符串的方法,参数接收长度,字符串中可能含有大写字母、 小写字母和数字。
- 编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置
- 随机产生一些数传递给一个函数,写程序找出并维护这些数的中位数
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序
- 中软面试(一):java写一个随机生成四位数的程序 每位数字不重复
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序
- 编写一个JAVA程序,创建指定长度的 int 型数组,并生成 100 以内随机数为数组中的每个元素赋值,然后输出数组
- 编写一个Java程序,创建制定长度的int型数组,并生成100以内的随机数为数组的每个元素赋值
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34–5 + 67–8 + 9 = 100。
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。
- 编写查找一个单链表特定元素的程序。分别使用递归和非递归方法实现,并比较它们的运行时间。
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序
- Java-第十四章-带参的方法(二)-编写程序,向整型数组的指定位置插入元素,并输出前后的值
- 一个生成java随机数字,数字字符串的方法