Skip to content

Commit dcc257a

Browse files
committed
Update Solution.rs
1 parent b2a5247 commit dcc257a

File tree

1 file changed

+20
-21
lines changed
  • solution/0200-0299/0295.Find Median from Data Stream

1 file changed

+20
-21
lines changed
Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,35 @@
1+
use std::cmp::Reverse;
2+
use std::collections::BinaryHeap;
3+
14
struct MedianFinder {
2-
nums: Vec<i32>,
5+
minQ: BinaryHeap<Reverse<i32>>,
6+
maxQ: BinaryHeap<i32>,
37
}
48

5-
/**
6-
* `&self` means the method takes an immutable reference.
7-
* If you need a mutable reference, change it to `&mut self` instead.
8-
*/
99
impl MedianFinder {
10-
/** initialize your data structure here. */
1110
fn new() -> Self {
12-
Self { nums: Vec::new() }
11+
MedianFinder {
12+
minQ: BinaryHeap::new(),
13+
maxQ: BinaryHeap::new(),
14+
}
1315
}
1416

1517
fn add_num(&mut self, num: i32) {
16-
let mut l = 0;
17-
let mut r = self.nums.len();
18-
while l < r {
19-
let mid = (l + r) >> 1;
20-
if self.nums[mid] < num {
21-
l = mid + 1;
22-
} else {
23-
r = mid;
24-
}
18+
self.maxQ.push(num);
19+
self.minQ.push(Reverse(self.maxQ.pop().unwrap()));
20+
21+
if self.minQ.len() > self.maxQ.len() + 1 {
22+
self.maxQ.push(self.minQ.pop().unwrap().0);
2523
}
26-
self.nums.insert(l, num);
2724
}
2825

2926
fn find_median(&self) -> f64 {
30-
let n = self.nums.len();
31-
if (n & 1) == 1 {
32-
return f64::from(self.nums[n >> 1]);
27+
if self.minQ.len() == self.maxQ.len() {
28+
let min_top = self.minQ.peek().unwrap().0;
29+
let max_top = *self.maxQ.peek().unwrap();
30+
(min_top + max_top) as f64 / 2.0
31+
} else {
32+
self.minQ.peek().unwrap().0 as f64
3333
}
34-
f64::from(self.nums[n >> 1] + self.nums[(n >> 1) - 1]) / 2.0
3534
}
3635
}

0 commit comments

Comments
 (0)