题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小最小元素的min函数。在该栈中,调用min、push 及 pop的时间复杂度都是O(1)。
本题关键问题在于:O(1)时间复杂度的 min 函数。
即无论占中元素如何变化。都要在 O(1)内知道最小值。
因此,需要设置两个栈:
1、数据栈,用于数据的压入和弹出
2、辅助栈,存入与数据栈中相对应的最小元素
即 数据栈每压入一个元素,辅助栈压入当时数据栈内所有元素的最小值;弹出数据栈元素时,也相应的弹出辅助栈内的min元素,保持辅助栈的栈顶元素永远是 数据栈元素的最小值。
在解决问题时,可以 举例 帮助自己思考。
[java] view plain copy 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、认识到了几个薄弱点:模板类的使用,虚析构函数的理解,常成员函数的理解 以及 系统库的有效利用(并不需要自己 从头定义栈)。