155— Min Stack
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) – Push element x onto stack.
- pop() – Removes the element on top of the stack.
- top() – Get the top element.
- getMin() – Retrieve the minimum element in the stack.
Example:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.
C++代码:
class MinStack {
public:
/** initialize your data structure here. */
void push(int x) {
v.push_back(x);
}
void pop() {
v.pop_back();
}
int top() {
return v.back();
}
int getMin() {
int len = v.size();
int min = v[0];
for(int i = 1; i < len;i++) {
if(v[i] < min) min = v[i];
}
return min;
}
private:
vector<int> v;
};
思路1:
- 简单的栈的应用, 遍历一下vector元素即可
思路2:
- 一般思路是用一个变量min记录当前最小, 但如果当前最小的元素出栈, 没办法记录min 为出栈后第一小的元素(即出栈前第二小的元素)
- 使用另一个vector min记录最小元素, 栈顶元素为当前最小
- 当vector出栈一个元素, 如果为当前最小, min 出栈, 此次 min的栈顶仍然为当前最小元素
C++代码:
class MinStack {
public:
/** initialize your data structure here. */
void push(int x) {
v.push_back(x);
if(min.empty() || x <= min.back()) min.push_back(x);
}
void pop() {
if(v.back() == min.back()) min.pop_back();
v.pop_back();
}
int top() {
return v.back();
}
int getMin() {
return min.back();
}
private:
vector<int> v;
vector<int> min;;
};