algorithm - 亚马逊采访 : Min stack

标签 algorithm data-structures stack

我最近参加了 SDE 的亚马逊面试。我被要求设计一个在 O(1) 中执行 pushpopmin 的堆栈。
我得到了逻辑并实现了堆栈的推送。在实现新堆栈的推送时,我在给定堆栈和最小堆栈上调用了推送,它们是新堆栈的一部分。面试官告诉我,我不能那样做,因为推送将是一个递归调用。我向他解释说,我们可以给它起不同的名字,但他坚持说对旧栈和新栈的操作都叫 push。

我怎样才能达到同样的效果?

最佳答案

实现这一点的一种方法是跟踪堆栈中某个元素下方的所有值的最小值。
对于堆栈中的每个元素,您实际上将拥有 2 个元素。一个是实际值,在它上面是它下面所有元素的最小值。

  1. 推送 - 将新值与顶部的最小值进行比较,然后推送该值和当前的最小值。
  2. 弹出 - 仅从堆栈中弹出两次(值和当前最小值)。
  3. Min - 返回栈顶。

示例:对于元素 7、9、3、5、1、2(按此顺序),堆栈将是:

TOP:    1 <--- min(7,9,3,5,1,2)
        2
        1 <--- min(7,9,3,5,1)
        1
        3 <--- min(7,9,3,5)
        5
        3 <--- min(7,9,3)
        3
        7 <--- min(7,9)
        9
        7 <--- min(7)
        7

关于algorithm - 亚马逊采访 : Min stack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39940165/

相关文章:

javascript - 如何修改重新排序 <ul> 的算法?

algorithm - Clojure 组顺序出现 - 改进功能

c++ - 如何将字符串转换为缩写形式?

data-structures - 如何在 Clojure 中编写最短且最地道的 CLI 计算器

c - 堆栈问题: Local variables vs Arithmetics

c - 在c中与不同类型的对象堆叠

algorithm - 如何计算 32 位整数中设置的位数?

java - 如何在 Java 中对多重映射进行排序?

algorithm - 是否有任何好的算法来检测停止向服务器发送心跳的客户端?

java - 为什么我应该使用 Deque 而不是 Stack?