题目
插入数据后,能够取得中位数,这里的中位数即数值在中间的数(logN)
- 如果一个数是中位数,则它一定小于等于右边最小的数,大于等于左边最大的数,所以准备一个大根堆,放比中位数小的数,准备一个小根堆,放比中位数大的数
- 所以有规律,将第一个数放入大根堆堆顶后,如果后续的数比大根堆堆顶的数大,则放入小根堆,否则放入大根堆,如果大根堆和小根堆的元素长度>=2,则弹出较多一方的堆顶进另一个堆中,最终中位数就是大根堆的堆顶
// 插入数据,随时能够取得中位数(logN)级别
// 大顶堆highHeap,小顶堆lowHeap
function getMid(num) {
if (!highHeap.length && !lowHeap.length) {
highHeap.insert(num);
}
if (highHeap[0] > num) {
highHeap.insert(num);
} else {
lowHeap.insert(num);
}
if (highHeap.length - lowHeap.length >= 2) {
let temp = highHeap.pop();
lowHeap.insert(temp);
}
if (lowHeap.length - highHeap.length >= 2) {
let temp = lowHeap.pop();
highHeap.insert(temp);
}
return highHeap[0];
}