Merge branch '10_find_the_median_of_a_number_stream'
This commit is contained in:
commit
55ca543bdc
82
10_find_the_median_of_a_number_stream.cpp
Normal file
82
10_find_the_median_of_a_number_stream.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
/* Problem: https://leetcode.com/problems/find-median-from-data-stream/
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
|
||||
enum class action { addNum, findMedian };
|
||||
|
||||
struct instruction {
|
||||
action do_;
|
||||
double val;
|
||||
};
|
||||
class MedianFinder {
|
||||
private:
|
||||
std::priority_queue<double, std::vector<double>, std::greater<double>>
|
||||
min_heap{std::greater<double>{}, {std::numeric_limits<double>::max()}};
|
||||
std::priority_queue<double> max_heap{std::less<double>{},
|
||||
{std::numeric_limits<double>::lowest()}};
|
||||
|
||||
public:
|
||||
MedianFinder() {}
|
||||
|
||||
void addNum(double num) {
|
||||
if (min_heap.size() == max_heap.size()) {
|
||||
if (num > min_heap.top()) {
|
||||
min_heap.push(num);
|
||||
} else {
|
||||
max_heap.push(num);
|
||||
}
|
||||
} else if (min_heap.size() < max_heap.size()) {
|
||||
if (num > max_heap.top()) {
|
||||
min_heap.push(num);
|
||||
} else {
|
||||
min_heap.push(max_heap.top());
|
||||
max_heap.pop();
|
||||
max_heap.push(num);
|
||||
}
|
||||
} else {
|
||||
if (num > min_heap.top()) {
|
||||
max_heap.push(min_heap.top());
|
||||
min_heap.pop();
|
||||
min_heap.push(num);
|
||||
} else {
|
||||
max_heap.push(num);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double findMedian() {
|
||||
if (min_heap.size() == max_heap.size()) {
|
||||
return (min_heap.top() + max_heap.top()) / 2;
|
||||
} else if (min_heap.size() < max_heap.size()) {
|
||||
return max_heap.top();
|
||||
} else {
|
||||
return min_heap.top();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
std::vector<instruction> instructions = {{action::addNum, 1},
|
||||
{action::addNum, 2},
|
||||
{action::findMedian, 0},
|
||||
{action::addNum, 3},
|
||||
{action::findMedian, 0}};
|
||||
MedianFinder *median_finder = new MedianFinder();
|
||||
std::cout << "{";
|
||||
for (instruction &i : instructions) {
|
||||
if (i.do_ == action::addNum) {
|
||||
median_finder->addNum(i.val);
|
||||
std::cout << "null, ";
|
||||
} else if (i.do_ == action::findMedian) {
|
||||
i.val = median_finder->findMedian();
|
||||
std::cout << i.val << ", ";
|
||||
}
|
||||
}
|
||||
std::cout << "\b\b}\n";
|
||||
}
|
@ -22,3 +22,5 @@ add_executable(7_reverse_nodes_in_k_group 7_reverse_nodes_in_k_group.cpp)
|
||||
add_executable(8_binary_tree_level_order_traversal 8_binary_tree_level_order_traversal.cpp)
|
||||
|
||||
add_executable(9_path_sum_iii 9_path_sum_iii.cpp)
|
||||
|
||||
add_executable(10_find_the_median_of_a_number_stream 10_find_the_median_of_a_number_stream.cpp)
|
||||
|
Loading…
Reference in New Issue
Block a user