本文共 1130 字,大约阅读时间需要 3 分钟。
如何在O(1)时间复杂度内获取栈中的最大值和最小值?
栈是一种常见的数据结构,支持push、pop和peek操作。然而,普通栈无法在O(1)时间复杂度内获取栈中的最大值和最小值,因为这些操作只能在栈顶进行。为了解决这个问题,我们可以引入两个辅助栈来记录栈的最大值和最小值,从而实现目标。
普通栈的局限性
普通栈的push、pop和peek操作只能在栈顶执行。因此,直接记录栈中的最大值和最小值并不容易,因为当栈被多次出栈后,原有的最大值和最小值可能已经被弹出,无法通过栈顶来判断。
引入辅助栈的思路
为了解决这个问题,我们可以定义两个辅助栈:一个用于记录当前栈内的最大值(maxStack),另一个用于记录当前栈内的最小值(minStack)。每次有元素入栈到主栈时,我们会将该元素压入maxStack和minStack,并检查是否需要更新这两个辅助栈的栈顶元素。例如,如果当前入栈的元素比minStack的栈顶元素小,就将minStack的栈顶元素替换为这个元素。类似地,对于maxStack也是如此。
当主栈中的元素被弹出时,maxStack和minStack也会相应地弹出对应的栈顶元素,以保持它们的准确性。这样,当需要获取栈中的最大值或最小值时,只需要访问maxStack和minStack的栈顶即可,时间复杂度为O(1)。
实现细节
push操作:每次将元素压入主栈时,同时将其压入maxStack和minStack。然后,检查是否需要更新maxStack和minStack的栈顶元素。
pop操作:每次从主栈中弹出一个元素时,也需要从maxStack和minStack中弹出对应的栈顶元素。
getMin和getMax操作:分别返回minStack和maxStack的栈顶元素,时间复杂度为O(1)。
性能分析
优点:
缺点:
总结
通过引入两个辅助栈,我们可以在O(1)时间复杂度内获取栈中的最大值和最小值。这种方法通过空间换时间,实现了目标,但需要权衡空间资源。
转载地址:http://gwozz.baihongyu.com/