一、题目
二、自己思路及代码
可以利用双栈来完成寻找最小值的操作,从stack1中依次取出元素放到stack2并记录最小值,这样元素全部取出后最小值旧得到了,再把元素依次放回到stack1中即可。
class Solution {
public:
void push(int value) {
st.push(value);
}
void pop() {
st.pop();
}
int top() {
return st.top();
}
int min() {
int min = 10002;
while (!st.empty()) {
if (st.top() < min) {
min = st.top();
}
st2.push(st.top());
st.pop();
}
while (!st2.empty()) {
st.push(st2.top());
st2.pop();
}
return min;
}
private:
stack<int> st;
stack<int> st2;
};
三、优秀思路记录
step 1:使用一个栈记录进入栈的元素,正常进行push、pop、top操作。
step 2:使用另一个栈记录每次push进入的最小值。
step 3:每次push元素的时候与第二个栈的栈顶元素比较,若是较小,则进入第二个栈,若是较大,则第二个栈的栈顶元素再次入栈,因为即便加了一个元素,它依然是最小值。于是,每次访问最小值即访问第二个栈的栈顶。
class Solution {
public:
//用于栈的push 与 pop
stack<int> s1;
//用于存储最小min
stack<int> s2;
void push(int value) {
s1.push(value);
//空或者新元素较小,则入栈
if(s2.empty() || s2.top() > value)
s2.push(value);
else
//重复加入栈顶
s2.push(s2.top());
}
void pop() {
s1.pop();
s2.pop();
}
int top() {
return s1.top();
}
int min() {
return s2.top();
}
};