题解 | #售价的中位数#
售价的中位数
https://www.nowcoder.com/practice/a1c7e3a0b2fa46da8a3430617b7d74ca
大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目主要考察了以下知识点:
- 使用最大堆和最小堆来维护动态数据流中的中位数,以及如何通过调整堆的大小和堆顶元素来实现。
- 堆的操作和优先队列的使用。
- 处理动态数据流问题的思路。
题目解答方法的文字分析
这个问题可以看作是一个实时更新中位数的过程,而不是在静态数组中找中位数。我们可以通过使用两个堆来实现。最大堆用于存放较小的一半数,最小堆用于存放较大的一半数。这样,中位数可以通过堆顶元素来得到。
下面是一个详细的步骤分析:
- 创建一个最大堆 maxHeap 和一个最小堆 minHeap。
- 遍历价格数组,依次将价格插入到合适的堆中,保持两个堆的大小差距不超过1,并且最大堆的堆顶小于等于最小堆的堆顶。
- 如果最大堆的大小比最小堆大1,那么中位数就是最大堆的堆顶元素。如果两个堆大小相等,中位数就是两个堆的堆顶元素之和除以2。
- 在插入价格时,需要根据大小关系选择插入到最大堆还是最小堆。如果插入到最大堆,需要将最大堆的堆顶元素弹出并插入到最小堆中,保持两个堆的平衡
本题解析所用的编程语言
本题解析所用的编程语言是C++。
完整且正确的编程代码
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param prices int整型vector * @return double浮点型vector */ vector<double> findMedianPrice(vector<int>& prices) { priority_queue<int, vector<int>, less<int>> maxHeap; // 最大堆 priority_queue<int, vector<int>, greater<int>> minHeap; // 最小堆 vector<double> medians; for (int price : prices) { if (maxHeap.empty() || price <= maxHeap.top()) { maxHeap.push(price); } else { minHeap.push(price); } // 调整堆的大小 if (maxHeap.size() > minHeap.size() + 1) { minHeap.push(maxHeap.top()); maxHeap.pop(); } else if (maxHeap.size() < minHeap.size()) { maxHeap.push(minHeap.top()); minHeap.pop(); } // 计算中位数 if (maxHeap.size() > minHeap.size()) { medians.push_back(maxHeap.top()); } else { medians.push_back((double)(maxHeap.top() + minHeap.top()) / 2.0); } } return medians; } };
您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!
阿Q的题解 文章被收录于专栏
阿Q秋招刷过的题