-
Notifications
You must be signed in to change notification settings - Fork 1
/
295_Find_Median_from_Data_Stream.cpp
129 lines (103 loc) · 3.08 KB
/
295_Find_Median_from_Data_Stream.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//Approach 1: Simple Sorting --- TLE
// TLE TLETLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE TLE
class MedianFinder {
public:
/** initialize your data structure here. */
vector<double> store;
MedianFinder() {
}
void addNum(int num) {
store.push_back(num);
}
double findMedian() {
sort(store.begin(), store.end());
int n = store.size();
return( n & 1 ? store[n / 2] : (store[n / 2] + store[n / 2 - 1]) / 2);
}
};
//Approach 2: Inserion Sort -- ACCEPTED but SLOWWWWWWWW
class MedianFinder {
public:
vector<double> store;
MedianFinder() {
}
void addNum(int num) {
if(store.empty())
store.push_back(num);
else
store.insert(lower_bound(store.begin(), store.end(), num),
num);
}
double findMedian() {
int n = store.size();
return( n & 1 ? store[n / 2] : (store[n / 2] + store[n / 2 - 1]) / 2);
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
//Approach - 3: Two Heaps (Priority Queue)
class MedianFinder {
public:
vector<double> store;
priority_queue<int> lower; //MAX heap
priority_queue<int, vector<int>, greater<int>> higher; //MIN heap
MedianFinder() {
}
//My Version: I understood WHY it was wrong. I will reexplain it to myself later
/*
void addNum(int num) {
higher.push(num);
if(lower.size() < higher.size()){
lower.push(higher.top());
higher.pop();
}
}
*/
//Tutorial Version
void addNum(int num) {
lower.push(num);
higher.push(lower.top());
lower.pop();
if(lower.size() < higher.size()){
lower.push(higher.top());
higher.pop();
}
}
double findMedian() {
if(lower.size() > higher.size()){
return (double) lower.top();
}
return (double) (lower.top() + higher.top()) / 2;
}
};
//Approach - 4: My version of Two Heaps (Accepted)
class MedianFinder {
public:
priority_queue<int> lower; //MAX heap (contains the LEFT part of data stream)
priority_queue<int, vector<int>, greater<int>> higher; //MIN heap (contains the RIGHT part of data stream)
MedianFinder() {
}
void addNum(int num) {
higher.push(num);
if(lower.size() < higher.size()){
lower.push(higher.top());
higher.pop();
}
else if(lower.top() > higher.top()){
int lower_top = lower.top();
int higher_top = higher.top();
lower.pop();
higher.pop();
lower.push(higher_top);
higher.push(lower_top);
}
}
double findMedian() {
if(lower.size() > higher.size()) return (double) lower.top();
return (double) (lower.top() + higher.top()) / 2;
}
};