思路1
- 使用插入排序,每次加入元素插入到指定位置
- 使用
lower_bound()找到元素需要插入的位置
代码1
class MedianFinder {
vector<int> store;
public:
void addNum(int num)
{
if (store.empty())
store.push_back(num);
else
store.insert(lower_bound(store.begin(), store.end(), num), num);
}
double findMedian()
{
int n = store.size();
if(n%2)
return store[n / 2];
else
return (store[n / 2 - 1] + store[n / 2]) * 0.5;
}
};
思路2
- 使用两个优先队列实现中位数在栈顶
小元素(小堆)逆序排序 大元素(大堆)顺序排序 - 如何实现两个优先队列的平衡?
往小堆加,小堆挑大元素放入大堆,大堆size()小了挑小元素往小堆加
代码2
class MedianFinder {
priority_queue<int> small;
priority_queue<int, vector<int>, greater<int>> big;
public:
void addNum(int num){
small.push(num);
big.push(small.top());
small.pop();
if (small.size() < big.size()) {
small.push(big.top());
big.pop();
}
}
double findMedian(){
return lo.size() > hi.size() ? (double) lo.top() : (lo.top() + hi.top()) * 0.5;
}
};