❓ 剑指 Offer 30. 包含min函数的栈
难度:简单
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min
函数在该栈中,调用 min
、push
及 pop
的时间复杂度都是
O
(
1
)
O(1)
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. 最小栈 相同!
💡思路:
使用一个额外的 minStack
,栈顶元素为当前栈中最小的值。
- 在对栈进行
push
入栈和pop
出栈操作时,同样需要对minStack
进行入栈出栈操作,从而使minStack
栈顶元素一直为当前栈中最小的值。 - 在进行
push
操作时,需要比较 入栈元素 和 当前栈中最小值,将值较小的元素push
到minStack
中。
🍁代码:(C++、Java)
C++
class MinStack {
private:
stack<int> dataStack, minStack;
public:
/** initialize your data structure here. */
MinStack() {
minStack.push(INT_MAX);
}
void push(int x) {
dataStack.push(x);
minStack.push(::min(minStack.top(), x));
}
void pop() {
dataStack.pop();
minStack.pop();
}
int top() {
return dataStack.top();
}
int min() {
return minStack.top();
}
};
/**
* 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();
*/
Java
class MinStack {
private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
/** initialize your data structure here. */
public MinStack() {
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
dataStack.push(x);
minStack.push(Math.min(minStack.peek(), x));
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.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();
*/
🚀 运行结果:
🕔 复杂度分析:
- 时间复杂度: O ( 1 ) O(1) O(1),栈的插入、删除与读取操作都是 O ( 1 ) O(1) O(1),我们定义的每个操作最多调用栈操作两次。
- 空间复杂度:
O
(
n
)
O(n)
O(n),其中
n
为总操作数。最坏情况下,我们会连续插入n
个元素,此时两个栈占用的空间为 O ( n ) O(n) O(n)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!