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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-03
  • 2021-09-13
  • 2022-12-23
  • 2022-02-19
  • 2021-10-24
  • 2021-10-07
猜你喜欢
  • 2021-07-09
  • 2021-09-07
  • 2021-11-27
  • 2023-03-09
相关资源
相似解决方案