题目
中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。
 例如 arr = [2,3,4] 的中位数是 3 。
 例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。
 实现 MedianFinder 类:
 MedianFinder() 初始化 MedianFinder 对象。
 void addNum(int num) 将数据流中的整数 num 添加到数据结构中。
 double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。
 示例 1:
 输入
 [“MedianFinder”, “addNum”, “addNum”, “findMedian”, “addNum”, “findMedian”]
 [[], [1], [2], [], [3], []]
 输出
 [null, null, null, 1.5, null, 2.0]
 解释
 MedianFinder medianFinder = new MedianFinder();
 medianFinder.addNum(1); // arr = [1]
 medianFinder.addNum(2); // arr = [1, 2]
 medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
 medianFinder.addNum(3); // arr[1, 2, 3]
 medianFinder.findMedian(); // return 2.0
 提示:
 -105 <= num <= 105
 在调用 findMedian 之前,数据结构中至少有一个元素
 最多 5 * 104 次调用 addNum 和 findMedian
2023年5月版
有的优先队列(堆)
 class MedianFinder {
 public:
 MedianFinder() {
 }
 void addNum(int num) {
 m_qTopMax.emplace(num);
 if (m_qTopMax.size() > m_qTopMin.size() + 1)
 {
 auto tmp = m_qTopMax.top();
 m_qTopMax.pop();
 m_qTopMin.emplace(tmp);
 }
 if (m_qTopMax.size() && m_qTopMin.size())
 {
 const int iTopMax = m_qTopMax.top();
 const int iTopMin = m_qTopMin.top();
 if (iTopMax > iTopMin)
 {
 m_qTopMax.pop();
 m_qTopMin.pop();
 m_qTopMax.push(iTopMin);
 m_qTopMin.push(iTopMax);
 }
 }
 }
 double findMedian() {
 if (m_qTopMax.size() == m_qTopMin.size())
 {
 return (m_qTopMax.top() + m_qTopMin.top()) / 2.0;
 }
 return m_qTopMax.top();
 }
 std::priority_queue m_qTopMax;
 std::priority_queue<int,std::vector,std::greater> m_qTopMin;
 };
8月第一版
用的可重复集合
class MedianFinder {
 public:
 MedianFinder() {
 }
 void addNum(int num) {
 m_set.emplace(num);
 if (1 == m_set.size())
 {
 m_it = m_set.begin();
 }
 if (num < *m_it)
 {
 m_iNum++;
 }
 while (m_iNum < m_set.size() / 2)
 {
 m_it++;
 m_iNum++;
 }
 while (m_iNum > m_set.size() / 2)
 {
 m_it–;
 m_iNum–;
 }
 }
 double findMedian() {
 if (1 & m_set.size())
 {
 return *m_it;
 }
 auto tmp = m_it;
 –tmp;
 return (*tmp + *m_it) / 2.0;
 }
 multiset m_set;
 multiset::iterator m_it = m_set.begin();
 int m_iNum = 0;//[m_set.begin(),m_it)的元素个数
 };
优化版
减少集合数
class MedianFinder {
 public:
 MedianFinder() {
 }
 void addNum(int num) {
 m_set.emplace(num);
 if (m_set.end() == m_it )
 {
 m_it = m_set.begin();
 return ;
 }
 if (num < *m_it)
 {
 m_iNum++;
 }
 while (m_iNum < m_set.size() / 2)
 {
 m_it++;
 m_iNum++;
 }
 while (m_iNum > m_set.size() / 2)
 {
 m_it–;
 m_iNum–;
 }
 }
 double findMedian() {
 if (1 & m_set.size())
 {
 return *m_it;
 }
 auto tmp = m_it;
 –tmp;
 return (*tmp + *m_it) / 2.0;
 }
 multiset m_set;
 multiset::iterator m_it = m_set.begin();
 int m_iNum = 0;//[m_set.begin(),m_it)的元素个数
 };
扩展阅读
视频课程
有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
 https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
 https://edu.csdn.net/lecturer/6176
相关下载
想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
 https://download.csdn.net/download/he_zhidan/88348653
| 鄙人想对大家说的话
 |
 |-|
 |闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。|
 | 墨家名称的来源:有所得以墨记之。 |
 |如果程序是一条龙,那算法就是他的是睛|
测试环境
操作系统:win7 开发环境: VS2019 C++17
 或者 操作系统:win10 开发环境:
VS2022 C++17



![2023年中国粘度指数改进剂行业需求现状及前景分析[图]](https://img-blog.csdnimg.cn/img_convert/793e6aed00a3b74dd57974b0e85a5ece.png)
















![web:[极客大挑战 2019]HardSQL](https://img-blog.csdnimg.cn/9bd741442cdb47969f38a3ad09c357ce.png)