-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path295 FindMedianfromDataStream.cpp
50 lines (43 loc) · 1.32 KB
/
295 FindMedianfromDataStream.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class MedianFinder {
public:
MedianFinder() {
}
void addNum(int num) {
if(minH.size() < maxH.size()) {
if(maxH.size() && num < maxH.front()) {
maxH.push_back(num);
push_heap(maxH.begin(), maxH.end());
pop_heap(maxH.begin(), maxH.end());
num = maxH.back();
maxH.pop_back();
}
minH.push_back(num);
push_heap(minH.begin(), minH.end(), greater<int>());
}
else {
if(minH.size() && num > minH.front()) {
minH.push_back(num);
push_heap(minH.begin(), minH.end(), greater<int>());
pop_heap(minH.begin(), minH.end(), greater<int>());
num = minH.back();
minH.pop_back();
}
maxH.push_back(num);
push_heap(maxH.begin(), maxH.end());
}
}
double findMedian() {
if(maxH.size() == minH.size())
return (maxH.front() + minH.front()) / 2.;
else
return maxH.front();
}
private:
vector<int> minH, maxH;
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/