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(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(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