295. Find Median from Data Stream
Data from Find stream Median
2023-09-11 14:22:45 时间
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.
For example,[2,3,4]
, the median is 3
[2,3]
, the median is (2 + 3) / 2 = 2.5
Design a data structure that supports the following two operations:
- void addNum(int num) - Add a integer number from the data stream to the data structure.
- double findMedian() - Return the median of all elements so far.
Example:
addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2
Follow up:
- If all integer numbers from the stream are between 0 and 100, how would you optimize it?
- If 99% of all integer numbers from the stream are between 0 and 100, how would you optimize it?
Approach #1: C++. [Heap/priority_queue]
class MedianFinder { public: /** initialize your data structure here. */ MedianFinder() { } void addNum(int num) { if (l_.empty() || num < l_.top()) { l_.push(num); } else { r_.push(num); } if (r_.size() > l_.size()) { l_.push(r_.top()); r_.pop(); } if (l_.size() - r_.size() == 2) { r_.push(l_.top()); l_.pop(); } } double findMedian() { if (l_.size() > r_.size()) return static_cast<double>(l_.top()); else return static_cast<double>(l_.top() + r_.top()) / 2; } private: priority_queue<int, vector<int>, less<int>> l_; priority_queue<int, vector<int>, greater<int>> r_; }; /** * Your MedianFinder object will be instantiated and called as such: * MedianFinder obj = new MedianFinder(); * obj.addNum(num); * double param_2 = obj.findMedian(); */
Approach #2: C++. [blance binary search tree]
// Author: Huahua // Running time: 172 ms class MedianFinder { public: /** initialize your data structure here. */ MedianFinder(): l_(m_.cend()), r_(m_.cend()) {} // O(logn) void addNum(int num) { if (m_.empty()) { l_ = r_ = m_.insert(num); return; } m_.insert(num); const size_t n = m_.size(); if (n & 1) { // odd number if (num >= *r_) { l_ = r_; } else { // num < *r_, l_ could be invalidated l_ = --r_; } } else { if (num >= *r_) ++r_; else --l_; } } // O(1) double findMedian() { return (static_cast<double>(*l_) + *r_) / 2; } private: multiset<int> m_; multiset<int>::const_iterator l_; // current left median multiset<int>::const_iterator r_; // current right median };
Appraoch #3: Java. [balnce binary search tree]
class MedianFinder { private Node root; private Node medianLeft; private Node medianRight; private int size; /** initialize your data structure here. */ public MedianFinder() { } public void addNum(int num) { if (root == null) { root = new Node(num); medianLeft = root; medianRight = root; } else { root.addNode(num); if (size % 2 == 0) { if (num < medianLeft.data) { medianRight = medianLeft; } else if (medianLeft.data <= num && num < medianRight.data) { medianLeft = medianLeft.successor(); medianRight = medianRight.predecessor(); } else if (num >= medianRight.data) { medianLeft = medianRight; } } else { if (num < medianLeft.data) { medianLeft = medianLeft.predecessor(); } else { medianRight = medianRight.successor(); } } } size++; } public double findMedian() { return (medianLeft.data + medianRight.data) / 2.0; } class Node { private Node parent; private Node left; private Node right; private int data; public Node(int data) { this.data = data; } public void addNode(int data) { if (data >= this.data) { if (right == null) { right = new Node(data); right.parent = this; } else { right.addNode(data); } } else { if (left == null) { left = new Node(data); left.parent = this; } else { left.addNode(data); } } } public Node predecessor() { if (left != null) { return left.rightMost(); } Node predecessor = parent; Node child = this; while (predecessor != null && child != predecessor.right) { child = predecessor; predecessor = predecessor.parent; } return predecessor; } public Node successor() { if (right != null) { return right.leftMost(); } Node successor = parent; Node child = this; while (successor != null && child != successor.left) { child = successor; successor = successor.parent; } return successor; } public Node leftMost() { if (left == null) return this; return left.leftMost(); } public Node rightMost() { if (right == null) return this; return right.rightMost(); } }; } /** * Your MedianFinder object will be instantiated and called as such: * MedianFinder obj = new MedianFinder(); * obj.addNum(num); * double param_2 = obj.findMedian(); */
相关文章
- Draw the RGB data from kinect C++ via opengl
- Data truncated for column '字段名' at row 1 的解决方法
- [React] Avoid this Common Suspense Gotcha in by Reading Data From Components
- [Cypress] Load Data from Test Fixtures in Cypress
- [Nuxt] Use Vuex Actions to Delete Data from APIs in Nuxt and Vue.js
- [RxJS] Updating Data with Scan
- [Falcor] Return the data from server
- 【COCOS2DX-LUA 脚本开发之十三】解决COCOS2DX-LUA编译到ANDROID找不到CCLUAENGINE、HELLOWORLD或出现GET DATA FROM FILE(XXX.LUA) FAILED/CAN NOT GET FILE DATA OF XXX.LUA、COCOS2DX
- Got fatal error 1236 from master when reading data from binary log: ‘Slave can not handle replicatio
- PHP curl报错“Problem (2) in the Chunked-Encoded data”解决方案
- [Spring] Spring Data JPA
- Managing Undo Data
- --output参数的使用:kubectl get secret regcred --output=“jsonpath={.data..dockerconfigjson}“ | base64 -d
- CL_FXS_URL_DATA_FETCHER - a good utility to fetch picture binary data according to url
- SAP Customer Data Cloud的Audit log设置
- 未能正确加载“VSTS for Database Professionals Sql Server Data-tier Application”包。
- Atititt hi dev eff db op Spring JDBC 目录 1. Spring JDBC21 1.1. Atitit 数据库db insert 插入数据data 最佳实践
- 使用SAP Data Hub Developer Edition将数据写入Hadoop
- ML之回归预测:利用九大类机器学习算法对无人驾驶汽车系统参数(2018年的data,18+2)进行回归预测值VS真实值
- DL之GRU(Tensorflow框架):基于茅台股票数据集利用GRU算法实现回归预测(保存模型.ckpt.index、.ckpt.data文件)
- 成功解决TypeError: Cannot cast array data from dtype('float64') to dtype('U32') according to the rule '
- 成功解决read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and wil
- 成功解决WARNING:tensorflow:From :read_data_sets (from tensorflow.contrib.learn.python.learn.
- Apache Flink®极简教程: 架构及原理 Stateful Computations over Data Streams
- Data source rejected establishment of connection, message from server: "Too many connections"
- elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样
- Using Redis Cache for session data storage in ASP.NET Core
- Mysql报错:Got fatal error 1236 from master when reading data from binary log: ‘Could not find first lo