Untitled

 avatar
unknown
c_cpp
2 years ago
2.3 kB
6
Indexable
#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <restbed>

using namespace std;
using namespace restbed;

// MedianFinder class (as defined in previous answer)

class MedianFinder {
public:
  // Constructor
  MedianFinder() {}

  // Add a new number to the stream and update the running median
  void addNumber(int num) {
    // Add the new number to the appropriate heap
    if (maxHeap.empty() || num <= maxHeap.top()) {
      maxHeap.push(num);
    } else {
      minHeap.push(num);
    }

    // Balance the heaps if necessary
    if (maxHeap.size() > minHeap.size() + 1) {
      minHeap.push(maxHeap.top());
      maxHeap.pop();
    } else if (minHeap.size() > maxHeap.size() + 1) {
      maxHeap.push(minHeap.top());
      minHeap.pop();
    }
  }

  // Return the current median
  double getMedian() {
    if (maxHeap.size() == minHeap.size()) {
      return (maxHeap.top() + minHeap.top()) / 2.0;
    } else if (maxHeap.size() > minHeap.size()) {
      return maxHeap.top();
    } else {
      return minHeap.top();
    }
  }

private:
  // Two heaps to store the stream of numbers: a max heap and a min heap
  priority_queue<int, vector<int>, less<int>> maxHeap;
  priority_queue<int, vector<int>, greater<int>> minHeap;
};

// Global instance of MedianFinder
MedianFinder medianFinder;

// API endpoint for adding a new number to the stream
void addNumber(const shared_ptr<Session> session) {
  // Get the request body (a JSON object with a single field "num")
  const auto request = session->get_request();
  string requestBody = request->get_body();
  json requestJson = json::parse(requestBody);
  int num = requestJson["num"];

  // Add the number to the stream and update the running median
  medianFinder.addNumber(num);

  // Return the current median in the response
  json responseJson;
  responseJson["median"] = medianFinder.getMedian();
  session->close(OK, responseJson.dump(), { { "Content-Type", "application/json" } });
}

// API endpoint for getting the current median
void getMedian(const shared_ptr<Session> session) {
  // Return the current median in the response
  json responseJson;
  responseJson["median"] = medianFinder.getMedian();
  session->close(OK, responseJson.dump(), { { "Content-Type", "application/json" } });
Editor is loading...