难度:简单
频次:59
题目:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
解题思路: 用辅助栈||只用一个栈
用辅助栈注意:
- 因为提示里的pop等操作都是在非空栈上调用,所以不用考虑太多
- 初始化辅助栈后添加一个最大的整数
- 然后只要原来的栈进一个,就判断值跟辅助栈顶的数哪个小,取小的直接再放辅助栈即可(这里不用把原来的腾出来)
- 然后出去 就两个栈一起出去就行了,右边的栈就记录了最小值的取值历史
代码
class MinStack {
public Stack<Integer> stack;
public Stack<Integer> minstack;
public MinStack() {
stack=new Stack<Integer>();
minstack=new Stack<Integer>();
//最小栈先放入一个最大值,可以一开始不用判断
minstack.push(Integer.MAX_VALUE);
}
public void push(int val) {
stack.push(val);
minstack.push(Math.min(minstack.peek(),val));
}
public void pop() {
stack.pop();
minstack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minstack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
用一个栈思路还是还差不多,只不过存进去的是一个数组
代码
class MinStack {
public Stack<int []> stack;
public MinStack() {
stack=new Stack<int []>();
}
public void push(int val) {
if(!stack.isEmpty()){
stack.push(new int[] {val,Math.min(val,stack.peek()[1])});
}else{
stack.push(new int[] {val,val});
}
}
public void pop() {
stack.pop();
}
public int top() {
return stack.peek()[0];
}
public int getMin() {
return stack.peek()[1];
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/