题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小最小元素的min函数。在该栈中,调用min、push 及 pop的时间复杂度都是O(1)。
本题关键问题在于:O(1)时间复杂度的 min 函数。
即无论占中元素如何变化。都要在 O(1)内知道最小值。
因此,需要设置两个栈:
1、数据栈,用于数据的压入和弹出
2、辅助栈,存入与数据栈中相对应的最小元素
即 数据栈每压入一个元素,辅助栈压入当时数据栈内所有元素的最小值;弹出数据栈元素时,也相应的弹出辅助栈内的min元素,保持辅助栈的栈顶元素永远是 数据栈元素的最小值。
在解决问题时,可以 举例 帮助自己思考。
- import java.util.Stack;
-
- public class Solution {
- Stack<Integer> stack = new Stack<>();
- Stack<Integer> minStack = new Stack<>();
-
- public void push(int node) {
- stack.push(node);
- if (minStack.isEmpty()) {
- minStack.push(node);
- } else {
- minStack.push(Math.min(node, minStack.peek()));
- }
- }
-
- public void pop() {
- if (!stack.isEmpty()) {
- stack.pop();
- minStack.pop();
- }
- }
-
- public int top() {
- return stack.peek();
- }
-
- public int min() {
- if (minStack.isEmpty())
- return Integer.MIN_VALUE;
- return minStack.peek();
- }
- }
通过这道题学习了:
1、举实例一步步分析,对问题的分析,有很大帮助
2、认识到了几个薄弱点:模板类的使用,虚析构函数的理解,常成员函数的理解 以及 系统库的有效利用(并不需要自己 从头定义栈)。