数据流中的中位数
本博客所有出现的 [不一样的剑指offer] 系列,个人认为都比书上的题解更好理解。
概括:书上的题目在实现两个数据结构的平衡的地方写的有点啰嗦。这里分别有两种方法实现,要简单很多。
1 优先级队列
class MedianFinder {
priority_queue<int> lo; // 大顶堆 左半边 从大到小 大的先出
//priority_queue<int, vector<int>, less<int> > lo; //相当于这样写
priority_queue<int, vector<int>, greater<int>> hi; // 小顶堆
public:
// Adds a number into the data structure.
void addNum(int num) {
lo.push(num); // 加到大顶堆
hi.push(lo.top()); // 平衡
lo.pop();
if (lo.size() < hi.size()) { // 维护两个堆元素个数
lo.push(hi.top());
hi.pop();
}
}
// Returns the median of current data stream
double findMedian() {
return lo.size() > hi.size() ? (double) lo.top() : (lo.top() + hi.top())*0.5;
}
};
2 multiset
class MedianFinder2 {
public:
/** initialize your data structure here. */
multiset<int, less<>> min_set;//最小值放前面 对应排序数组的右半边
multiset<int, greater<>> max_set;//最大值放前面,对应排序数组的左半边
MedianFinder2() {
}
void addNum(int num) {
max_set.insert(num);
min_set.insert(*max_set.begin());
max_set.erase(max_set.find(*max_set.begin()));
if(max_set.size()<min_set.size()){
max_set.insert(*min_set.begin());
min_set.erase(min_set.find(*min_set.begin()));
}
}
double findMedian() {
return max_set.size()>min_set.size()?*max_set.begin(): (double(*min_set.begin())+double(*max_set.begin()))/2;
}
};
个人见解,欢迎讨论指教!