剑指-30:包含min函数的栈
题目
定义栈的数据结构,
请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,
调用 min、push 及 pop 的时间复杂度都是 O(1)。
解题思路
- 使用 int 保存当前栈最小值,使
min()
调用时可以直接获取
问题:若当前pop()
是最小值,将最小值抛出后,无法找到新的最小值 - 解决第一步问题
用一个新的栈放置最小数值的数据,长度与主栈相同。使主栈与最小值栈数据一一对应。
class MinStack {
public:
stack<int> mainStack;
stack<int> minStack;
/** initialize your data structure here. */
MinStack() {
while(!mainStack.empty()) mainStack.pop();
while(!minStack.empty()) minStack.pop();
}
void push(int x) {
mainStack.push(x);
if (!minStack.empty() && minStack.top() < x) // 当最小值栈为空,或者当前塞入的值不是最小值时,更改x为最小值
x = minStack.top();
minStack.push(x);
}
void pop() {
mainStack.pop();
minStack.pop();
}
int top() {
return mainStack.top();
}
int min() {
return minStack.top();
}
};
多出了一个栈的空间,空间复杂度变为`O(n)`
- 优化第二步的空间
- 栈顶元素需要跟当前最小值元素进行关联
- 元素用一个指针指向该元素为栈顶时的最小元素
- 待完善