Skip to content

Commit 90c2646

Browse files
committed
feat: add python and java solutions to lcci question: 17.20.Continuous Median
https://lc.netlify.app/#/lcci/17.20.Continuous%20Median/README
1 parent 2cc8917 commit 90c2646

File tree

4 files changed

+166
-3
lines changed

4 files changed

+166
-3
lines changed

lcci/17.20.Continuous Median/README.md

+57-2
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,75 @@ findMedian() -> 2
3131

3232
## 解法
3333
<!-- 这里可写通用的实现逻辑 -->
34-
34+
- 创建大根堆、小根堆,其中:大根堆存放较小的一半元素,小根堆存放较大的一半元素。
35+
- 添加元素时,若两堆元素个数相等,放入小根堆(使得小根堆个数多1);若不等,放入大根堆(使得大小根堆元素个数相等)
36+
- 取中位数时,若两堆元素个数相等,取两堆顶求平均值;若不等,取小根堆堆顶。
3537

3638
### Python3
3739
<!-- 这里可写当前语言的特殊实现逻辑 -->
3840

3941
```python
42+
class MedianFinder:
43+
44+
def __init__(self):
45+
"""
46+
initialize your data structure here.
47+
"""
48+
self.max_heap = []
49+
self.min_heap = []
50+
51+
52+
def addNum(self, num: int) -> None:
53+
if len(self.max_heap) == len(self.min_heap):
54+
heapq.heappush(self.min_heap, -heapq.heappushpop(self.max_heap, -num))
55+
else:
56+
heapq.heappush(self.max_heap, -heapq.heappushpop(self.min_heap, num))
4057

58+
def findMedian(self) -> float:
59+
return (-self.max_heap[0] + self.min_heap[0]) / 2 if len(self.max_heap) == len(self.min_heap) else self.min_heap[0]
60+
61+
62+
# Your MedianFinder object will be instantiated and called as such:
63+
# obj = MedianFinder()
64+
# obj.addNum(num)
65+
# param_2 = obj.findMedian()
4166
```
4267

4368
### Java
4469
<!-- 这里可写当前语言的特殊实现逻辑 -->
4570

4671
```java
47-
72+
class MedianFinder {
73+
private Queue<Integer> minHeap;
74+
private Queue<Integer> maxHeap;
75+
76+
/** initialize your data structure here. */
77+
public MedianFinder() {
78+
minHeap = new PriorityQueue<>();
79+
maxHeap = new PriorityQueue<>((a, b) -> b - a);
80+
}
81+
82+
public void addNum(int num) {
83+
if (minHeap.size() == maxHeap.size()) {
84+
maxHeap.offer(num);
85+
minHeap.offer(maxHeap.poll());
86+
} else {
87+
minHeap.offer(num);
88+
maxHeap.offer(minHeap.poll());
89+
}
90+
}
91+
92+
public double findMedian() {
93+
return minHeap.size() == maxHeap.size() ? (minHeap.peek() + maxHeap.peek()) / 2.0 : minHeap.peek();
94+
}
95+
}
96+
97+
/**
98+
* Your MedianFinder object will be instantiated and called as such:
99+
* MedianFinder obj = new MedianFinder();
100+
* obj.addNum(num);
101+
* double param_2 = obj.findMedian();
102+
*/
48103
```
49104

50105
### ...

lcci/17.20.Continuous Median/README_EN.md

+54-1
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,66 @@ findMedian() -&gt; 2
5959
### Python3
6060

6161
```python
62+
class MedianFinder:
6263

64+
def __init__(self):
65+
"""
66+
initialize your data structure here.
67+
"""
68+
self.max_heap = []
69+
self.min_heap = []
70+
71+
72+
def addNum(self, num: int) -> None:
73+
if len(self.max_heap) == len(self.min_heap):
74+
heapq.heappush(self.min_heap, -heapq.heappushpop(self.max_heap, -num))
75+
else:
76+
heapq.heappush(self.max_heap, -heapq.heappushpop(self.min_heap, num))
77+
78+
def findMedian(self) -> float:
79+
return (-self.max_heap[0] + self.min_heap[0]) / 2 if len(self.max_heap) == len(self.min_heap) else self.min_heap[0]
80+
81+
82+
# Your MedianFinder object will be instantiated and called as such:
83+
# obj = MedianFinder()
84+
# obj.addNum(num)
85+
# param_2 = obj.findMedian()
6386
```
6487

6588
### Java
6689

6790
```java
68-
91+
class MedianFinder {
92+
private Queue<Integer> minHeap;
93+
private Queue<Integer> maxHeap;
94+
95+
/** initialize your data structure here. */
96+
public MedianFinder() {
97+
minHeap = new PriorityQueue<>();
98+
maxHeap = new PriorityQueue<>((a, b) -> b - a);
99+
}
100+
101+
public void addNum(int num) {
102+
if (minHeap.size() == maxHeap.size()) {
103+
maxHeap.offer(num);
104+
minHeap.offer(maxHeap.poll());
105+
} else {
106+
minHeap.offer(num);
107+
maxHeap.offer(minHeap.poll());
108+
}
109+
}
110+
111+
public double findMedian() {
112+
return minHeap.size() == maxHeap.size() ? (minHeap.peek() + maxHeap.peek()) / 2.0 : minHeap.peek();
113+
}
114+
}
115+
116+
/**
117+
* Your MedianFinder object will be instantiated and called as such:
118+
* MedianFinder obj = new MedianFinder();
119+
* obj.addNum(num);
120+
* double param_2 = obj.findMedian();
121+
*/
69122
```
70123

71124
### ...
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class MedianFinder {
2+
private Queue<Integer> minHeap;
3+
private Queue<Integer> maxHeap;
4+
5+
/** initialize your data structure here. */
6+
public MedianFinder() {
7+
minHeap = new PriorityQueue<>();
8+
maxHeap = new PriorityQueue<>((a, b) -> b - a);
9+
}
10+
11+
public void addNum(int num) {
12+
if (minHeap.size() == maxHeap.size()) {
13+
maxHeap.offer(num);
14+
minHeap.offer(maxHeap.poll());
15+
} else {
16+
minHeap.offer(num);
17+
maxHeap.offer(minHeap.poll());
18+
}
19+
}
20+
21+
public double findMedian() {
22+
return minHeap.size() == maxHeap.size() ? (minHeap.peek() + maxHeap.peek()) / 2.0 : minHeap.peek();
23+
}
24+
}
25+
26+
/**
27+
* Your MedianFinder object will be instantiated and called as such:
28+
* MedianFinder obj = new MedianFinder();
29+
* obj.addNum(num);
30+
* double param_2 = obj.findMedian();
31+
*/
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class MedianFinder:
2+
3+
def __init__(self):
4+
"""
5+
initialize your data structure here.
6+
"""
7+
self.max_heap = []
8+
self.min_heap = []
9+
10+
11+
def addNum(self, num: int) -> None:
12+
if len(self.max_heap) == len(self.min_heap):
13+
heapq.heappush(self.min_heap, -heapq.heappushpop(self.max_heap, -num))
14+
else:
15+
heapq.heappush(self.max_heap, -heapq.heappushpop(self.min_heap, num))
16+
17+
def findMedian(self) -> float:
18+
return (-self.max_heap[0] + self.min_heap[0]) / 2 if len(self.max_heap) == len(self.min_heap) else self.min_heap[0]
19+
20+
21+
# Your MedianFinder object will be instantiated and called as such:
22+
# obj = MedianFinder()
23+
# obj.addNum(num)
24+
# param_2 = obj.findMedian()

0 commit comments

Comments
 (0)