/
295_findMedianFromDataStream.cpp
39 lines (35 loc) · 1.28 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
// https://leetcode.com/problems/find-median-from-data-stream/
// Difficulty : Hard
/***********************************************************************
*
* Median is the middle value in an ordered integer list.
* If the size of the list is even, there is no middle value.
* So the median is the mean of the two middle value.
*
**********************************************************************/
class MedianFinder {
private:
priority_queue<int> small; // ensure small.size() >= large.size()
priority_queue<int, vector<int>, greater<int>> large;
public:
// Adds a number into the data structure.
void addNum(int num) {
if (small.empty()) { small.push(num); return; }
if (num > small.top()) large.push(num);
else small.push(num);
if (small.size() > large.size() + 1) { // small - large > 1,把small挪一个到large
large.push(small.top());
small.pop();
}
if (large.size() > small.size()) { // large > small
small.push(large.top());
large.pop();
}
}
// Returns the median of current data stream
double findMedian() {
return small.size() == large.size()
? (small.top() + large.top()) / 2.0
: small.top();
}
};