设计一个支持 push,pop,top 操做,并能在常数时间内检索到最小元素的栈。java
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.python
示例:数组
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
起初我觉得定义一个指针指向最小值便可,后面才想到在栈中弹出元素时,若是弹出的元素是最小值,那这个指针就须要更 改选择另外一个最小元素。没办法,想作到入栈出栈和弹出最小值均为 O(1) 的时间复杂度,那么只能牺牲空间来换。能够另外新建一个栈来顺序存入数据最小值。数据结构
注意:Python中没有单独的 Stack 数据结构,其实它的数组就有弹出和压入功能。也能够用 collections.deque()
数据结构。 另外在数据入栈时须要判断该值是否比辅助栈的栈顶元素的值更小,若是更小,也应该将它加入辅助栈。而且须要判断辅助栈是否为空,在不空的条件下才能够取栈顶元素比较,不然会溢出。app
事实上每次都要调用函数判断是否为空这个操做,相对这道题的运行时间来讲很耗时,就这道题而言是能够避免的,只需给辅助栈加入整型最大值做为栈底元素便可。函数
class MinStack { Stack<Integer> s1 = new Stack<>();//初始化栈 Stack<Integer> s2 = new Stack<>();//辅助栈顺序存入最小值 public MinStack() { s2.push(Integer.MAX_VALUE);//先加入整型最大值在栈底,避免判断辅助栈是否为空 } public void push(int x) { s1.push(x); if (s2.peek() >= x) s2.push(x);//比栈顶元素值小或相等就加入辅助栈 } public void pop() { int tmp = s1.pop(); if (tmp == s2.peek()) s2.pop();//弹出栈的元素值若是和辅助栈顶元素值相等,也在辅助栈弹出它 } public int top() { return s1.peek();//返回栈顶元素 } public int getMin() { return s2.peek();//返回辅助栈栈顶元素便是最小值 } }
class MinStack: #初始化数据结构(数组),s2做为辅助栈加入整形最大值作栈底,避免判断辅助栈是否为空 def __init__(self): self.s1 = [] self.s2 = [] self.s2.append(sys.maxsize) def push(self, x: int) -> None: self.s1.append(x) #取栈顶元素直接用数组负值索引 Array[-1] 取最后一个值 if self.s2[-1] >= x: self.s2.append(x) def pop(self) -> None: tmp = self.s1.pop() if tmp == self.s2[-1]: self.s2.pop() def top(self) -> int: return self.s1[-1] def getMin(self) -> int: return self.s2[-1]