day5
乐观者不谨慎,悲观者不活跃,只有悲观的乐观主义才是强者姿态!
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 1:
Input
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]
Output
[null,null,null,null,-3,null,0,-2]
Explanation
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); // return -3
minStack.pop();
minStack.top(); // return 0
minStack.getMin(); // return -2
分析
实现一个新的栈类,可以利用栈的先进后出的基本功能,重构一个栈类。具体规则如下:
其中创建一个基本存数据的栈A和一个最小栈B(存每一步的最小值),push()方法:当前元素正常入A栈,当B空或当前元素小于等于B的栈顶元素,入B栈;
pop()方法:若A栈栈顶元素与B栈栈顶元素相等,则A,B栈顶元素都出栈,否则只将A栈栈顶元素出栈;
top()方法:A栈栈空返回NULL,否则返回A栈栈顶元素;
min()方法:B栈不空返回B栈栈顶元素。
代码
#include<iostream>
#include<stack>
using namespace std;
class MinStack {
private:
stack<int> stackData;
stack<int> stackMin;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
stackData.push(x);
if (stackMin.empty() || x <= stackMin.top()) {
stackMin.push(x);
}
}
void pop() {
if (stackData.top() == stackMin.top())
{
stackData.pop();
stackMin.pop();
}
else {
stackData.pop();
}
}
int top() {
if (!stackData.empty()) {
return stackData.top();
}
else{
return NULL;
}
}
int getMin() {
if (!stackMin.empty())
return stackMin.top();
}
};
int main() {
MinStack minStack;
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
int min = minStack.getMin(); // return -3
minStack.pop();
int top = minStack.top(); // return 0
int min2 = minStack.getMin(); // return -2
printf("min:%d, top:%d, min2:%d", min,top,min2);
return 0;
}
/**
* 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->getMin();
*/
时间复杂度与空间复杂度分析
时间复杂度 | 空间复杂度 |
---|---|
0(1) | O(1) |
心得
复杂度分析需要加强理解,有时候没看见循环结构一下子就不知道怎么分析了,这点之后要注意改善。