剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ba… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
难点:栈的push和pop时间复杂度本身就是O(1),关键在于如何实现min。
思路:
一个数据栈栈存储原数据,再用一个辅助栈来维护最小值
-
数据栈正常存储元素即可
-
辅助栈的栈顶元素就等于目前数据栈内的最小元素,因此每次新增元素只需要和辅助栈的栈顶元素相比较,如果比栈顶元素小,就入栈,每当调用min函数,直接弹出辅助栈的栈顶元素,时间复杂度为O(1)
函数设计
重点在于维护数据栈和辅助栈的数据一致
push函数:
- 数据栈直接压入栈
- 辅助栈要判断是否小于等于栈顶元素或者栈内是否为空,如果是就压入栈
pop函数:
- 数据栈直接出栈
- 辅助栈栈顶元素和数据栈出栈的元素是否相同,相同就出栈
min函数
- 直接返回辅助栈的栈顶元素即可
top函数:
- 直接返回数据栈的栈顶元素即可
代码
class MinStack {
LinkedList<Integer> stack;
LinkedList<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new LinkedList<>();
minStack = new LinkedList<>();
}
public void push(int x) {
stack.push(x);
if(minStack.isEmpty()||x <= minStack.peek()){
minStack.push(x);
}
}
public void pop() {
if(stack.pop().equals(minStack.peek())){
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}