题目来源:牛客网
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
思路分析
首先列举一个压栈数组,观察其特点
| Stack | top | ||||||
|---|---|---|---|---|---|---|---|
| stack1 | top | 66 | |||||
| stack1 | top | 60 | 50 | ||||
| stack1 | top | 60 | 50 | 50 | |||
| stack1 | top | 60 | 50 | 50 | 80 | ||
| stack1 | top | 60 | 50 | 50 | 80 | 20 | |
| stack1 | top | 60 | 50 | 50 | 80 | 20 | 0 |
根据上面分析来分析每次压栈的时候最小值的变化
| 压栈次数 | 最小值 |
|---|---|
| 1 | 66 |
| 2 | 50 |
| 3 | 50 |
| 4 | 50 |
| 5 | 20 |
| 6 | 0 |
可以看出来只有在当前压入的数值小于或者等于该栈中的当前最小值时,才需要更改最小值。
再观察出栈的情况
| Stack | top | |||||
|---|---|---|---|---|---|---|
| stack1 | top | 60 | 50 | 50 | 80 | 20 |
| stack1 | top | 60 | 50 | 50 | 80 | |
| stack1 | top | 60 | 50 | 50 | ||
| stack1 | top | 60 | 50 | |||
| stack1 | top | 66 | ||||
| stack1 | top |
根据上面分析来分析每次出栈的时候最小值的变化
| 出栈次数 | 最小值 |
|---|---|
| 1 | 20 |
| 2 | 50 |
| 3 | 50 |
| 4 | 50 |
| 5 | 66 |
| 6 |
可以看出来只有在当前出栈的数值等于该栈中的当前最小值时,才需要更改最小值。
总结
对于本题构造两个栈(stack和min),stack用于存放压入的数据,min用于存放每一段的最小值。
根据分析可以知道:
当向stack压入元素时
如果stack内没有元素(空栈)时,则直接压入到min中
否则,判断压入的元素跟min栈顶元素的关系。
即如果该元素小于等于min的栈顶元素,则压入min中。反之,则不入栈。
当stack弹出元素时
如果弹出元素的值等于min的当前栈顶元素,则弹出min的当前栈顶元素
代码实现
import java.util.Stack;
public class Solution {
private Stack<Integer> stack = new Stack<>();
private Stack<Integer> min = new Stack<>();
public void push(int node) {
if (this.stack.empty() || node <= min.peek()) {
min.push(node);
}
this.stack.push(node);
}
public void pop() {
if (this.stack.pop() == min.peek()) {
min.pop();
}
}
public int top() {
return this.stack.peek();
}
public int min() {
return this.min.peek();
}
}