Google面试题
股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值)。
SOLUTION 1:
1.维持两个heap,一个是最小堆,一个是最大堆。
2.一直使maxHeap的size大于minHeap.
3. 当两边size相同时,比较新插入的value,如果它大于minHeap的最大值,把它插入到minHeap。并且把minHeap的最小值移动到maxHeap。
...具体看代码
1 /************************************************************** 2 * 3 * 08-722 Data Structures for Application Programmers 4 * Lab 7 Heaps and Java PriorityQueue class 5 * 6 * Find median of integers using Heaps (maxHeap and minHeap) 7 * 8 * Andrew id: yuzhang 9 * Name: Yu Zhang 10 * 11 **************************************************************/ 12 13 import java.util.*; 14 15 public class FindMedian { 16 private static PriorityQueue<Integer> maxHeap, minHeap; 17 18 public static void main(String[] args) { 19 20 Comparator<Integer> revCmp = new Comparator<Integer>() { 21 @Override 22 public int compare(Integer left, Integer right) { 23 return right.compareTo(left); 24 } 25 }; 26 27 // Or you can use Collections' reverseOrder method as follows. 28 // Comparator<Integer> revCmp = Collections.reverseOrder(); 29 30 maxHeap = new PriorityQueue<Integer>(20, revCmp); 31 minHeap = new PriorityQueue<Integer>(20); 32 33 addNumber(6); 34 addNumber(4); 35 addNumber(3); 36 addNumber(10); 37 addNumber(12); 38 System.out.println(minHeap); 39 System.out.println(maxHeap); 40 System.out.println(getMedian()); 41 42 addNumber(5); 43 System.out.println(minHeap); 44 System.out.println(maxHeap); 45 System.out.println(getMedian()); 46 47 addNumber(7); 48 addNumber(8); 49 System.out.println(minHeap); 50 System.out.println(maxHeap); 51 System.out.println(getMedian()); 52 } 53 54 /* 55 * Note: it maintains a condition that maxHeap.size() >= minHeap.size() 56 */ 57 public static void addNumber(int value) { 58 if (maxHeap.size() == minHeap.size()) { 59 if (minHeap.peek() != null && value > minHeap.peek()) { 60 maxHeap.offer(minHeap.poll()); 61 minHeap.offer(value); 62 } else { 63 maxHeap.offer(value); 64 } 65 } else { 66 if (value < maxHeap.peek()) { 67 minHeap.offer(maxHeap.poll()); 68 maxHeap.offer(value); 69 } else { 70 minHeap.offer(value); 71 } 72 } 73 } 74 75 /* 76 * If maxHeap and minHeap are of different sizes, 77 * then maxHeap must have one extra element. 78 */ 79 public static double getMedian() { 80 if (maxHeap.isEmpty()) { 81 return -1; 82 } 83 84 if (maxHeap.size() == minHeap.size()) { 85 return (double)(minHeap.peek() + maxHeap.peek())/2; 86 } else { 87 return maxHeap.peek(); 88 } 89 } 90 }