LeetCode 155:最小栈 Min Stack
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
示例:
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() 数据结构。 另外在数据入栈时需要判断该值是否比辅助栈的栈顶元素的值更小,如果更小,也应该将它加入辅助栈。并且需要判断辅助栈是否为空,在不空的条件下才可以取栈顶元素比较,否则会溢出。
事实上每次都要调用函数判断是否为空这个操作,相对这道题的运行时间来说很耗时,就这道题而言是可以避免的,只需给辅助栈加入整型最大值作为栈底元素即可。
Java:
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();//返回辅助栈栈顶元素即是最小值 }}Python3:
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]欢迎关注微.信公.众号:爱写Bug
继续阅读与本文标签相同的文章
-
容器集群监控利器 阿里云Prometheus正式免费公测
2026-05-22栏目: 教程
-
英航官网流量劫持导致数据泄露,收到16亿GDPR罚单
2026-05-22栏目: 教程
-
一篇搞懂TCP、HTTP、Socket、Socket连接池
2026-05-22栏目: 教程
-
如何成为SEO专家(国内seo专家排名10步指南)
2026-05-22栏目: 教程
-
Android开发进阶——自定义View的使用及其原理探索
2026-05-22栏目: 教程
