最小元素的栈

2024-03-07 13:38:46 浏览数 (1)

1 问题

如何利用python在常数时间里检测到最小的元素栈。

2 方法

用一个变量来记录最小值,需要的时候直接取到就可以实现目标。 借助一个辅助栈,由于入栈出栈操作是动态的,所以最小值也是动态的,我们可以用一个栈来维护每一个状态下的最小值。具体实现:

代码清单 1

代码语言:text复制
Class Stack:
   def __init__(self):
       #initialize your data structure here.
       self.data_stack = []
       self.min_stack = []
#1. 当第一个元素入栈时,它就是当前栈的最小值,于是Push到min_stack
#2. 当入栈元素小于min_stack的栈顶元素时,说明该元素入栈之后是当前状态的最小值,因此将它push到min_stack中
#3. 当入栈元素大于min_stack的栈顶元素时,说明该元素入栈之后当前状态的最小值没有发生改变,因此将原来的最小值(就是min_stack栈顶元素)push到min_stack中
   def push(self, x: int) -> None:
       self.data_stack.append(x)
       if self.min_stack == [] or self.min_stack[-1] > x:
           self.min_stack.append(x)
       else:
           self.min_stack.append(self.min_stack[-1])
   def pop(self) -> None:
       self.data_stack = self.data_stack[0:-1]
       self.min_stack = self.min_stack[0:-1]
   def top(self) -> int:
       return self.data_stack[-1]
   Def Min(self) -> int:
       return self.min_stack[-1]

3 结语

这个问题有个注意的点是在常数时间内检索到。遍历栈或者用一些排序方式固然可以找到最小值,但是无法在满足常数时间的要求。我们这里借助一个辅助栈,由于入栈出栈操作是动态的,所以最小值也是动态的,我们可以用一个栈来维护每一个状态下的最小值。熟练的利用python栈章节的知识点,push,pop,top等熟练的运用可以学习到不局限于书上的知识点。

0 人点赞