思路:
要求O(1)复杂度找到,不遍历整个集合是不可能的。
但如果牺牲空间复杂度来满足这个要求 也是可以的。
有两种思路:
- 用两个栈。一个存储元素本身,一个存储当前最小的元素。那么入栈就得两个都入,出栈也是。
- 用一个栈,但是存两倍个数的元素。第一层存元素本身,第二层存当前最小值,入栈入两次,第二次判断最小元素并存入。出栈也是。
接下来就只看第二种方法的代码:
class MinStack {
public static Stack<Integer> st;
/** initialize your data structure here. */
public MinStack() {
st = new Stack<Integer>();
}
public void push(int x) {
//空栈直接入栈
if(st.isEmpty()){
st.push(x);
st.push(x);
}else{
int tmp = st.peek();
st.push(x);
//获取当前最小值,存入
if(tmp<=x){
st.push(tmp);
}else{
st.push(x);
}
}
}
public void pop() {
st.pop();
st.pop();
}
public int top() {
int tmp = st.pop();
int res = st.peek();
st.add(tmp);
return res;
}
public int getMin() {
return st.peek();
}
}