|
| 1 | +public class MedianFinder { |
| 2 | + |
| 3 | + List<int> Nums; |
| 4 | + public MedianFinder() { |
| 5 | + |
| 6 | + Nums = new List<int>(); |
| 7 | + } |
| 8 | + |
| 9 | + public void AddNum(int num) { |
| 10 | + int index = Nums.BinarySearch(num); |
| 11 | + if (index < 0) |
| 12 | + { |
| 13 | + index = ~index; |
| 14 | + } |
| 15 | + Nums.Insert(index, num); |
| 16 | + } |
| 17 | + |
| 18 | + public double FindMedian() { |
| 19 | + int count = Nums.Count; |
| 20 | + return count % 2 == 0 ? (double)((Nums[count / 2 - 1] + Nums[count / 2]) * 0.5) : Nums[count / 2]; |
| 21 | + } |
| 22 | +} |
| 23 | + |
| 24 | +/** |
| 25 | + * Your MedianFinder object will be instantiated and called as such: |
| 26 | + * MedianFinder obj = new MedianFinder(); |
| 27 | + * obj.AddNum(num); |
| 28 | + * double param_2 = obj.FindMedian(); |
| 29 | + |
| 30 | + // ***IMP : Not passing for few test cases |
| 31 | + class MedianFinder |
| 32 | + { |
| 33 | +
|
| 34 | + private PriorityQueue<int, int> smallHeap; //small elements - maxHeap |
| 35 | + private PriorityQueue<int, int> largeHeap; //large elements - minHeap |
| 36 | +
|
| 37 | + public MedianFinder() |
| 38 | + { |
| 39 | + smallHeap = new PriorityQueue<int, int>(); |
| 40 | + largeHeap = new PriorityQueue<int, int>(); |
| 41 | + } |
| 42 | +
|
| 43 | + public void addNum(int num) |
| 44 | + { |
| 45 | + smallHeap.Enqueue(num, num); |
| 46 | + if ( |
| 47 | + smallHeap.Count - largeHeap.Count > 1 || |
| 48 | + !(largeHeap.Count <= 0) && |
| 49 | + smallHeap.Peek() > largeHeap.Peek() |
| 50 | + ) |
| 51 | + { |
| 52 | + if (smallHeap.Count > 0) |
| 53 | + { |
| 54 | + int ele = smallHeap.Dequeue(); |
| 55 | + largeHeap.Enqueue(ele, ele); |
| 56 | + } |
| 57 | + } |
| 58 | + if (largeHeap.Count - smallHeap.Count > 1) |
| 59 | + { |
| 60 | + if (largeHeap.Count > 0) |
| 61 | + { |
| 62 | + int ele = largeHeap.Dequeue(); |
| 63 | + smallHeap.Enqueue(ele, ele); |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | +
|
| 68 | + public double findMedian() |
| 69 | + { |
| 70 | + if (smallHeap.Count == largeHeap.Count) |
| 71 | + { |
| 72 | + return (double)(largeHeap.Peek() + smallHeap.Peek()) / 2; |
| 73 | + } |
| 74 | + else if (smallHeap.Count > largeHeap.Count) |
| 75 | + { |
| 76 | + return (double)smallHeap.Peek(); |
| 77 | + } |
| 78 | + else |
| 79 | + { |
| 80 | + return (double)largeHeap.Peek(); |
| 81 | + } |
| 82 | + } |
| 83 | + } |
| 84 | + */ |
0 commit comments