【问题标题】:Amazon interview: Min stack亚马逊采访:最小堆栈
【发布时间】:2017-02-17 19:20:49
【问题描述】:

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

我怎样才能达到同样的效果? (面试官看起来很刻薄,因为我的逻辑是正确的,他仍然告诉我由于上述原因我做错了)

【问题讨论】:

  • 面试官看起来很刻薄 - 我非常怀疑面试官是刻薄。你的回答很可能是错误的,因为亚马逊不太可能让不理解他们所问问题的人采访你。我们看不到您使用非面向对象的语言编程,因为您在此处发布了零代码。

标签: algorithm data-structures stack


【解决方案1】:

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

  1. 推送 - 将新值与最高最小值进行比较,然后同时推送该值和当前最小值。
  2. Pop - 只需从堆栈中弹出两次(值和当前最小值)。
  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

【讨论】:

    【解决方案2】:

    解决方案简单而优雅——使用额外的堆栈来保持最小值。

    1.To retrieve the current minimum, just return the top element from minimum stack.
    2.Each time you perform a push operation, check if the pushed element is a new minimum. If it is, push it to the minimum stack
    too.
    3.When you perform a pop operation, check if the popped element is the same as the current minimum. If it is, pop it off the minimum
    stack too.
    

    【讨论】:

    • "检查推送的元素是否是新的最小值" -- 我认为即使它等于当前的最小值,你也需要推送元素。这可能是您的意思,但“新的最低限度”对我来说意味着“严格低于当前”。
    【解决方案3】:

    使常规堆栈中的每个值都成为具有 2 个元素的向量,其中第一个元素表示一个值,第二个元素表示运行最小值。

    包装方法可以屏蔽向量,因此接口和签名中只有常规值可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2012-12-08
      • 2021-09-13
      • 2022-12-03
      • 1970-01-01
      • 2011-04-22
      相关资源
      最近更新 更多