|
1 | 1 | public class MedianFinder {
|
2 |
| - private List<int> nums; |
3 |
| - private int curIndex; |
| 2 | + private PriorityQueue<int, int> minQ = new PriorityQueue<int, int>(); |
| 3 | + private PriorityQueue<int, int> maxQ = new PriorityQueue<int, int>(Comparer<int>.Create((a, b) => b.CompareTo(a))); |
4 | 4 |
|
5 |
| - /** initialize your data structure here. */ |
6 | 5 | public MedianFinder() {
|
7 |
| - nums = new List<int>(); |
8 |
| - } |
9 | 6 |
|
10 |
| - private int FindIndex(int val) { |
11 |
| - int left = 0; |
12 |
| - int right = nums.Count - 1; |
13 |
| - while (left <= right) { |
14 |
| - int mid = left + (right - left) / 2; |
15 |
| - if (val > nums[mid]) { |
16 |
| - left = mid + 1; |
17 |
| - } else { |
18 |
| - right = mid - 1; |
19 |
| - } |
20 |
| - } |
21 |
| - return left; |
22 | 7 | }
|
23 | 8 |
|
24 | 9 | public void AddNum(int num) {
|
25 |
| - if (nums.Count == 0) { |
26 |
| - nums.Add(num); |
27 |
| - curIndex = 0; |
28 |
| - } else { |
29 |
| - curIndex = FindIndex(num); |
30 |
| - if (curIndex == nums.Count) { |
31 |
| - nums.Add(num); |
32 |
| - } else { |
33 |
| - nums.Insert(curIndex, num); |
34 |
| - } |
| 10 | + maxQ.Enqueue(num, num); |
| 11 | + minQ.Enqueue(maxQ.Peek(), maxQ.Dequeue()); |
| 12 | + if (minQ.Count > maxQ.Count + 1) { |
| 13 | + maxQ.Enqueue(minQ.Peek(), minQ.Dequeue()); |
35 | 14 | }
|
36 | 15 | }
|
37 | 16 |
|
38 | 17 | public double FindMedian() {
|
39 |
| - if (nums.Count % 2 == 1) { |
40 |
| - return (double)nums[nums.Count / 2]; |
41 |
| - } else { |
42 |
| - if (nums.Count == 0) { |
43 |
| - return 0; |
44 |
| - } else { |
45 |
| - return (double) (nums[nums.Count / 2 - 1] + nums[nums.Count / 2]) / 2; |
46 |
| - } |
47 |
| - } |
| 18 | + return minQ.Count == maxQ.Count ? (minQ.Peek() + maxQ.Peek()) / 2.0 : minQ.Peek(); |
48 | 19 | }
|
49 | 20 | }
|
50 | 21 |
|
|
0 commit comments