题目描述
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
解题思路
题目要求,以常数时间获取栈中最小值,最直观的感觉,将最小值始终放在栈顶,直接弹出速度最快!重点在压栈操作上,因为top方法要返回真实的栈顶元素,结合需求,每次push操作要压入两个元素。刚开始时,直接push两个相同的元素即可,之后,每次push操作,第一次先把元素push入栈,接着比较压入的元素和栈顶的最小元素的大小比较,如果栈顶最小元素大于压入的元素,则将其再次压入(更新最小值),否则,还将原来的最小值重新进行push操作。这样目的为了始终保持栈顶的元素就是最小元素。那top方法,只需弹出栈顶元素的下一个元素即可!
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
import java.util.Stack;
public class minStack {
//最小栈(只能借助一个栈)
private Stack<Integer> data;
public minStack(){
data=new Stack<Integer>();
}
public void push(int x){
if (data.isEmpty()){//初始状态
data.push(x);
data.push(x);
}else {
int tmp=data.peek();//栈非空,查看栈顶元素
data.push(x);//先将插入元素压栈
if (tmp<x){//因为是最小栈,所以要始终将最小值放在栈顶(常数时间内,可以最快获取最小)
data.push(tmp);
}else {
data.push(x);
}
}
}
public void pop(){
data.pop();
data.pop();
}
public int top(){
return data.get(data.size()-2);
}
public int getMin(){
return data.peek();
}
public static void main(String[] args) {
minStack test=new minStack();
test.push(3);
test.push(1);
test.push(5);
test.push(0);
System.out.println(test.getMin());
}
}
总结
本题来源于Leetcode中 归属于栈类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
觉得本博客有用的客官,可以给个赞鼓励下! 嘿嘿