@@ -36,8 +36,8 @@ findMedian() -> 2
36
36
<!-- 这里可写通用的实现逻辑 -->
37
37
38
38
- 创建大根堆、小根堆,其中:大根堆存放较小的一半元素,小根堆存放较大的一半元素。
39
- - 添加元素时,若两堆元素个数相等,放入小根堆(使得小根堆个数多 1);若不等,放入大根堆(使得大小根堆元素个数相等)
40
- - 取中位数时,若两堆元素个数相等,取两堆顶求平均值;若不等,取小根堆堆顶 。
39
+ - 添加元素时,先放入小根堆,然后将小根堆对顶元素弹出并放入大根堆(使得大根堆个数多 1);若大小根堆元素个数差超过 1,则将大根堆元素弹出放入小根堆。
40
+ - 取中位数时,若大根堆元素较多,取大根堆堆顶,否则取两堆顶元素和的平均值 。
41
41
42
42
<!-- tabs:start -->
43
43
@@ -52,18 +52,19 @@ class MedianFinder:
52
52
"""
53
53
initialize your data structure here.
54
54
"""
55
- self .max_heap = []
56
55
self .min_heap = []
57
-
56
+ self .max_heap = []
58
57
59
58
def addNum (self , num : int ) -> None :
60
- if len ( self .max_heap) == len (self .min_heap):
61
- heapq.heappush(self .min_heap , - heapq.heappushpop (self .max_heap, - num ))
62
- else :
63
- heapq.heappush(self .max_heap , - heapq.heappushpop (self .min_heap, num ))
59
+ heapq.heappush (self .min_heap, num)
60
+ heapq.heappush(self .max_heap , - heapq.heappop (self .min_heap ))
61
+ if len ( self .max_heap) - len ( self .min_heap) > 1 :
62
+ heapq.heappush(self .min_heap , - heapq.heappop (self .max_heap ))
64
63
65
64
def findMedian (self ) -> float :
66
- return (- self .max_heap[0 ] + self .min_heap[0 ]) / 2 if len (self .max_heap) == len (self .min_heap) else self .min_heap[0 ]
65
+ if len (self .max_heap) > len (self .min_heap):
66
+ return - self .max_heap[0 ]
67
+ return (self .min_heap[0 ] - self .max_heap[0 ]) / 2
67
68
68
69
69
70
# Your MedianFinder object will be instantiated and called as such:
@@ -78,27 +79,28 @@ class MedianFinder:
78
79
79
80
``` java
80
81
class MedianFinder {
81
- private Queue <Integer > minHeap;
82
- private Queue <Integer > maxHeap;
82
+ private PriorityQueue <Integer > minHeap;
83
+ private PriorityQueue <Integer > maxHeap;
83
84
84
85
/* * initialize your data structure here. */
85
86
public MedianFinder () {
86
87
minHeap = new PriorityQueue<> ();
87
- maxHeap = new PriorityQueue<> ((a, b) - > b - a );
88
+ maxHeap = new PriorityQueue<> (Collections . reverseOrder() );
88
89
}
89
90
90
91
public void addNum (int num ) {
91
- if (minHeap. size() == maxHeap. size()) {
92
- maxHeap. offer(num);
92
+ minHeap. offer(num);
93
+ maxHeap. offer(minHeap. poll());
94
+ if (maxHeap. size() - minHeap. size() > 1 ) {
93
95
minHeap. offer(maxHeap. poll());
94
- } else {
95
- minHeap. offer(num);
96
- maxHeap. offer(minHeap. poll());
97
96
}
98
97
}
99
98
100
99
public double findMedian () {
101
- return minHeap. size() == maxHeap. size() ? (minHeap. peek() + maxHeap. peek()) / 2.0 : minHeap. peek();
100
+ if (maxHeap. size() > minHeap. size()) {
101
+ return maxHeap. peek();
102
+ }
103
+ return (minHeap. peek() + maxHeap. peek()) * 1.0 / 2 ;
102
104
}
103
105
}
104
106
0 commit comments