亚马逊采访:敏叠

时间:2016-10-09 04:56:50

标签: algorithm data-structures stack

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

我怎么能达到同样的目标? (面试官似乎非常卑鄙,因为我的逻辑是正确的,他仍然告诉我,由于上述原因,我做错了)

3 个答案:

答案 0 :(得分:8)

实现此目的的一种方法是跟踪堆栈中某些元素下方所有值的最小值 对于堆栈中的每个元素,您实际上将拥有2个元素。一个具有实际值,并且在其上方,是其下面所有元素的最小值。

  1. 推送 - 将新值与最小值进行比较,同时推送值和当前最小值。
  2. Pop - 只需从堆栈弹出两次(值和当前最小值)。
  3. Min - 返回堆栈顶部。
  4. 示例:对于元素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
    

答案 1 :(得分:1)

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

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.

答案 2 :(得分:0)

将规则堆栈中的每个值都设为一个包含2个元素的向量,其中第一个元素代表一个值,第二个元素代表运行的最小值。

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