题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
解题思路
声明两个栈,一个记录数据,另一个记录最小数据当前的最小数据。例如:依次压入3,4,2,5,0。
因此dataStack为3,4,2,5,0,minStack为3,3,2,2,0
每次出栈,不仅要把dataStack栈顶元素弹出,还要把minStack栈顶元素弹出。
显然空间复杂度较高。
import java.util.Stack;
public class Solution {
Stack<Integer> dataStack = new Stack<>();
Stack<Integer> minStack = new Stack<>();
public void push(int node) {
if(dataStack.isEmpty()) {
dataStack.push(node);
minStack.push(node);
} else {
dataStack.push(node);
int peek = minStack.peek();
if(node < peek) {
minStack.push(node);
} else {
minStack.push(peek);
}
}
}
public void pop() {
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.peek();
}
}
看看下面这个方法,声明一个栈stack,一个记录最小值的变量minValue来记录当前的最小值。
如何记录之前的最小值,因为如果将最小值弹出后,当前最小值minValue需要修改,将之前的最小值也存在栈stack中,下图绿色方块。
例如:依次压入3,4,2,5,0
压栈:
1、压入3,当前最小值minValue为3
2、压入4,当前最小值minValue为3
3、压入2,当前最小值为2,需要记录之前的最小值,先压入之前的最小值3,在压入2
后面按照此规则压入。
出栈:
如果出栈元素等于最小值,说明是将最小值出栈,因此需要将上一个最小值赋值给minValue
例如:
0出栈,0等于最小值minValue,因此需要将0下面的2页出栈,赋值给minValue。
代码
import java.util.Stack;
public class Solution {
Stack<Integer> stack = new Stack<>();
int minValue = Integer.MAX_VALUE;
public void push(int node) {
if(stack.isEmpty()) {
minValue = node;
stack.push(minValue);
} else {
if(node <= minValue) {
stack.push(minValue);
minValue = node;
}
}
stack.push(node);
}
public void pop() {
if(minValue == stack.peek()) {
stack.pop();
minValue = stack.peek();
}
stack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minValue;
}
}