题目地址(30. 包含min函数的栈)
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.minStack.min(); --> 返回 -2.提示:各函数的调用总次数不超过 20000 次注意:本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/
前置知识
公司
- 暂无
思路
这道题考察的是实现 空间复杂度O(1)的情况来实现一个min函数
正常要找到一个最小值 需要遍历整个栈 但是我们可以使用一个辅助栈来完成
每次在栈中添加一个新元素的时候 如果这个值是最小值 就把他加到stackmin中 如果不是 就把之前的最小值再添加一次
这样随时都可以知道最小值是什么了
关键点
代码
- 语言支持:Java
Java Code:
import java.util.Stack;class MinStack {/** initialize your data structure here. */Stack<Integer> stack;Stack<Integer> stackMin;public MinStack() {stack = new Stack<Integer>();stackMin = new Stack<Integer>();stackMin.push(Integer.MAX_VALUE);}public void push(int x) {stack.push(x);if (x < stackMin.peek()) {stackMin.push(x);}else{stackMin.push(stackMin.peek());}}public void pop() {stack.pop();stackMin.pop();}public int top() {return stack.peek();}public int min() {// if(stackMin.peek() == Integer.MAX_VALUE){// return// }return stackMin.peek();}}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(x);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.min();*/
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=w6CHV)
- 空间复杂度:
#card=math&code=O%28n%29&id=Z9E4R)
