剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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 次
思路
这道题之前写过数据结构与算法—栈---最小栈、滑动窗口最大值
需要借助两个栈
一个栈1正常入栈、出栈操作
一个栈2负责存储栈1此时的最小值
class MinStack {
/** initialize your data structure here. */
Stack<Integer> stack1 = null;
//新建一个栈,存放最小值
Stack<Integer> stack2 = null;
public MinStack() {
stack1 = new Stack<Integer>();
//新建一个栈,存放最小值
stack2 = new Stack<Integer>();
}
public void push(int x) {
stack1.push(x);
if (stack2.isEmpty()){
stack2.push(x);
}else{
if (x < stack2.peek())
{
stack2.push(x);
}else{
stack2.push(stack2.peek());
}
}
}
public void pop() {
stack1.pop();
stack2.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.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();
*/
本文介绍了如何实现一个包含min函数的栈,使得push、pop和min操作的时间复杂度均为O(1)。通过维护两个栈,一个用于正常入栈和出栈,另一个记录当前栈中的最小值,可以确保在查找最小值时的效率。在push操作中,如果新入栈元素小于栈2的栈顶元素,则将新元素入栈到栈2;否则,只保留栈2的栈顶元素。在pop操作时,两个栈同时弹出元素。这样,栈2始终保存了最小值。

106

被折叠的 条评论
为什么被折叠?



