这是一个面试问题。您需要设计一个包含整数值的队列,并且具有一个getMedian()函数,该函数返回当前队列的中值元素。您可以使用O(n)额外空间。
getMedian()可以实现时间复杂度<为O(n)?
例如: 当队列具有以下值(2,1,2,2,6,4,2,5)时 此方法返回2并且不删除该对象。
答案 0 :(得分:9)
您的问题的已知实现如下:
你需要实现的是2堆,一个是最小堆,另一个是最大堆 您还需要一个整数来告诉我们队列中的对象数量。
堆的限制如下:
1.最小堆将具有队列中较大的对象
2.最大堆将具有队列中较小的对象
3.最大堆将与最小堆
这样,如果你有一个奇数个对象,那么中位数就是你的最大堆中的最大对象。如果你有一个偶数个对象,你的中位数将是你的两个根的平均值(最大堆的最大值,最小堆的最小值)。
重要的是要注意,如果你的堆变得不均匀,例如如果你将从某个堆“弹出”,你将需要从其他堆中移除并移动它。但这不是问题,因为您需要处理的只是堆积物的根源而已。
getMedian的时间复杂度变为O(1)
刚刚找到一篇关于这个主题的文章:link
回答评论
max-heap包含半个最小元素
向队列添加新号码时,首先要检查队列中的对象数量
如果您要添加的数字是偶数,则表示需要将其添加到max-heap,因为两个队列的大小相等。
然后,您可以看到最大堆中的最大值
如果它大于你的数字,你可以将它插入max-heap
如果它更小,意味着你的新数字可能大于最小堆中的数字
所以你看看最小堆中的最小值是什么
如果你的数字小于min,那么你可以将它插入max-heap中,如果它更大,那么你将min-heap中的min移动到max-heap,然后在min-中插入你的新数字堆。
如果数字是奇数,则需要添加到最小堆,因为最大堆还有一个,依此类推..
它有点复杂,但如果你仍然不明白我不介意伪造它为你编码