小学生都能看懂的题解 | #包含min函数的栈#
包含min函数的栈
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49
想象一下,你有一个装玩具的盒子,你可以把玩具放进去(压入),也可以拿出来(弹出)。现在,我们要做一个特殊的盒子,它不仅能告诉你最后一个放进去的玩具是什么(栈顶),还能随时告诉你盒子里最小的玩具是什么(最小值)。
特殊盒子的工作方式:
- 放玩具(压入):
- 当你放一个新的玩具进去时,我们会记住它是不是比现在盒子里最小的玩具还要小。
- 如果是,那么我们会把这个新玩具的信息记两遍:
- 一次放在正常的地方,一次放在特别的地方用来记住当前最小的玩具。
- 拿玩具(弹出):
- 当你拿出一个玩具时,如果这个玩具是最小的那个,那么我们也要从记住最小玩具的地方把它去掉。
- 看最后一个放进去的玩具(栈顶):
- 这个很简单,就是看看最上面的一个玩具是什么。
- 找最小的玩具(最小值):
- 我们总是记得当前最小的玩具是什么,所以这个也很容易做到。
示例:
假设我们的特殊盒子开始是空的。
- 你放了一个
-1进去。这时,最小的是-1,也是最后放进去的一个。 - 再放一个
2进去。这时,最后放进去的是2,但是最小的还是-1。 - 问最小的玩具是什么?答案是
-1。 - 看看最后放进去的玩具是什么?答案是
2。 - 把
2拿出来。现在最小的还是-1,最后放进去的也是-1。 - 放一个
1进去。这时,最后放进去的是1,但是最小的还是-1。 - 再看看最后放进去的玩具是什么?答案是
1。 - 最后再问一次最小的玩具是什么?答案还是
-1。
这就是一个简单的特殊盒子(栈)工作的方式,它可以让你很快知道最小的玩具是什么。
现在来看看简单的代码实现:
import java.util.Stack;
public class MinStack {
//定义两个盒子
private Stack<Integer> stack;
//放最小的玩具
private Stack<Integer> minStack;
public MinStack() {
this.stack = new Stack<>();
this.minStack = new Stack<>();
}
// 放入玩具
public void push(int x) {
if (minStack.isEmpty() || x <= minStack.peek()) {
minStack.push(x);
}
stack.push(x);
}
// 取出玩具
public int pop() {
int popped = stack.pop();
if (!minStack.isEmpty() && popped == minStack.peek()) {
minStack.pop();
}
return popped;
}
// 查看最后放的玩具
public int top() {
return stack.peek();
}
// 查看最小的玩具
public int min() {
return minStack.peek();
}
}
如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。
#牛客创作赏金赛#小学生都能看懂的算法 文章被收录于专栏
主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。
查看14道真题和解析