为了账号安全,请及时绑定邮箱和手机立即绑定

实现一个队列,其中push_rear(),pop_front()和get_min()都是常量时间操作

实现一个队列,其中push_rear(),pop_front()和get_min()都是常量时间操作

慕后森 2019-07-31 18:13:35
实现一个队列,其中push_rear(),pop_front()和get_min()都是常量时间操作我遇到了这个问题: 实现一个队列,其中push_rear(),pop_front()和get_min()都是常量时间操作。我最初想过使用一个最小堆数据结构,它对于get_min()具有O(1)复杂度。但是push_rear()和pop_front()将是O(log(n))。有谁知道实现这样一个有O(1)push(),pop()和min()的队列的最佳方法是什么?我搜索了这个,并想指出这个算法极客线程。但似乎没有一个解决方案遵循所有3种方法的恒定时间规则:push(),pop()和min()。感谢所有的建议。
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超5个赞

您可以使用O(1)pop(),push()和get_min()实现堆栈:只需将当前最小值与每个元素一起存储。因此,例如,堆栈[4,2,5,1](顶部的1)变为[(4,4), (2,2), (5,2), (1,1)]

然后,您可以使用两个堆栈来实现队列。推到一个堆栈,从另一个堆栈弹出; 如果第二个堆栈在弹出期间为空,则将所有元素从第一个堆栈移动到第二个堆栈。

例如,对于pop请求,从第一个堆栈移动所有元素[(4,4), (2,2), (5,2), (1,1)],第二个堆栈将是[(1,1), (5,1), (2,1), (4,1)]。现在返回第二个堆栈的顶部元素。

要查找队列的最小元素,请查看各个最小堆栈的最小两个元素,然后取这两个值中的最小值。(当然,这里有一些额外的逻辑,其中一个堆栈是空的,但这并不难解决)。

这将有O(1)get_min()push()摊销O(1) pop()


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 1579 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信