大家好,我是开车的阿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!

京公网安备 11010502036488号