实现一个栈, 支持以下操作:
push(val)
将 val 压入栈pop()
将栈顶元素弹出, 并返回这个弹出的元素min()
返回栈中元素的最小值
要求 O(1) 开销.
样例
样例 2:
输入:
push(1)
min()
push(2)
min()
push(3)
min()
输出:
1
1
1
注意事项
保证栈中没有数字时不会调用 min()
解题思路:
一开始我想错了,想通过增加一个变量min来保存当前最小值,可是没考虑到pop后的动态变化。
所以这里需要两个stack,一个用来正常实现push,pop。一个用来压入当前最小值,注意在每次push,pop操作时维护这个栈的性质。
public class MinStack {
private Stack<Integer> s;
private Stack<Integer> sMin;
public MinStack() {
// do intialization if necessary
s = new Stack<>();
sMin = new Stack<>();
}
/*
* @param number: An integer
* @return: nothing
*/
public void push(int number) {
// write your code here
s.push(number);
if(sMin.empty()==true || sMin.peek()>=number)
sMin.push(number);
}
/*
* @return: An integer
*/
public int pop() {
// write your code here
if(sMin.peek().equals(s.peek()))
sMin.pop();
return s.pop();
}
/*
* @return: An integer
*/
public int min() {
// write your code here
return sMin.peek();
}
}
解法二:
public class MinStack {
Stack<Integer> stk1 = new Stack<>();
Stack<Integer> stk2 = new Stack<>();
public MinStack() {
// do intialization if necessary
}
/*
* @param number: An integer
* @return: nothing
*/
public void push(int number) {
// write your code here
stk1.push(number);
if(stk2.isEmpty() || number<=stk2.peek())
stk2.push(number);
else
stk2.push(stk2.peek());
}
/*
* @return: An integer
*/
public int pop() {
// write your code here
stk2.pop();
return stk1.pop();
}
/*
* @return: An integer
*/
public int min() {
// write your code here
return stk2.peek();
}
}