NowCoder LeetCode
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
解题思路
用一个栈data保存数据,用另外一个栈min保存依次入栈最小的数
比如,data中依次入栈,
5
,
4
,
3
,
8
,
10
,
11
,
12
,
1
则min依次入栈,
5
,
4
,
3
,3,3,3,3,
1
每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈,否则原来栈顶元素重复入栈。
class Solution {
public:
void push(int value) {
dataStack.push(value);
if(minStack.empty()) minStack.push(value);
else if(minStack.top()<value) minStack.push(minStack.top());
else minStack.push(value);
}
void pop() {
if(!dataStack.empty()) {
dataStack.pop();
minStack.pop();
} else dataStack.pop();
}
int top() {
return dataStack.top();
}
int min() {
return minStack.top();
}
private:
stack<int> dataStack;
stack<int> minStack;
};
LeetCode 155 答案
class MinStack {
public:
/** initialize your data structure here. */
vector<pair<int,int>> st;
MinStack() {
}
void push(int x) {
int minimum = x;
if(!st.empty()) minimum = min(minimum,st.back().second);
st.push_back(make_pair(x,minimum));
}
void pop() {
st.pop_back();
}
int top() {
return st.back().first;
}
int getMin() {
return st.back().second;
}
};
/**
* 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();
*/