面试问题: 我们想要找出堆栈中的最小元素。 所以,以这种方式实现堆栈,它会在O(1)中的任何时间点给出最小元素 另一个条件是,用于寻找最小元素的空间复杂度应为O(1)
时间复杂度:
按下操作:O(1)
弹出操作:O(1)
获取最小元素:O(1)
怎么做?
例如, 推(2);
堆栈:
2< - Top
最低: 2
推(3);
堆栈:
3< - Top
2
最低: 2
推(1);
堆栈:
1< - Top
3
2
最低: 1
弹出();
堆栈:
3< - Top
2
最低:2
答案 0 :(得分:2)
正如其他人所提到的那样,空间复杂性本来就是O(n)
,但对这样一个问题的简单回答就是让push和pop做更多的工作,并且比平常更低效。
因此,您向堆栈添加int minVal
,然后无论何时推送或弹出,只需更新相对于您推送和弹出的值的值。因此,如果我们的min是1并且我们弹出1,那么我们再次寻找整个堆栈中的最小值。同样如果我们按0但我们的min当前为1,我们将min设置为0.
这会使getMin()
O(1)
但其他功能效率降低 - 这仍然符合问题的规则。
当然,有更好的方法可以减少对推/弹的影响,但它会炸掉空间。
答案 1 :(得分:2)
使用第二个值来标注堆栈的每个元素x
,这里的最小元素为#34;,由mb(x)
表示。然后,当您按x
时,您设置了mb(x) = min{x, mb(element below x)}
,这就是它的所有内容。
如果这违反了空间约束(可以合理地解释为只有找到最小值的操作必须具有恒定的空间复杂度,否则您可以使用尽可能多的额外空间,即空间要求堆栈本身是无限的),然后Eric的答案将解决这个问题。
答案 2 :(得分:0)
保持最小值并制作另一个堆栈,一个跟踪先前最小值的堆栈......
至于空间复杂性,我很失落如何拉掉那个,除非n == 1,idk你如何获得O(1)空间