leetcode 155. Min Stack
(Easy)
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.
- 核心问题: 设计一个栈,要求能在实现栈的基本功能的同时,增添一个额外功能: 返回当前栈中最小的值(以常数时间)
- 思路: 用空间换时间, 每个栈元素同时应该存储这个元素为top时调用min应该弹出的元素.
自己的代码:
class ListNode
{
public:
int val;
ListNode* pre;
ListNode* pre_min;
};
class MinStack {
ListNode* end;
public:
MinStack() {
end = nullptr;
}
void push(int x) {
ListNode* newNode = new ListNode();
newNode->val = x;
if (end == nullptr) {
end = newNode;
newNode->pre = nullptr;
newNode->pre_min = newNode;
}
else {
newNode->pre = end;
if (newNode->val <= end->pre_min->val) {
newNode->pre_min = newNode;
}
else {
newNode->pre_min = end->pre_min;
}
end = newNode;
}
}
void pop() {
ListNode* l = end->pre;
if (l) {
delete end;
end = l;
}
else {
delete end;
end = nullptr;
}
}
int top() {
return end->val;
}
int getMin() {
return end->pre_min->val;
}
};
耗时相同的参考代码:
用两个栈替代链表, 本质一样
class MinStack {
private:
stack<int> main;
stack<int> mins;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
main.push(x);
(!mins.empty() && mins.top() < x) ? mins.push(mins.top()) : mins.push(x);
}
void pop() {
mins.pop();
main.pop();
}
int top() {
return main.top();
}
int getMin() {
return mins.top();
}
};