链接
牛客:包含min函数的栈
LeetCode:剑指 Offer 30. 包含min函数的栈
思路
我们需要实现四个函数 push(), pop(), top(), min(),我们借助两个栈来实现这样的功能。
其中一个就是正常的栈 onstack,还有一个是存放最小值的栈 minstack。
在每个函数中,正常的栈就正常保持原来那样操作,同时最小值栈也要进行相应的处理,
- min() 函数返回的就是最小值栈的栈顶,我们只要保证 minstack 栈顶都是最小值就可以。
- 当 push 的时候,我们首先判断 minstack 是否为空,为空的话将值 push,不然的话比较 min() 和当前值的大小,如果比 min() 还小,将值 push 进去,这样的话可以保证 minstack 栈顶最小。
- 当 pop 的时候,我们要判断 minstack 和 onstack 的栈顶值是否一样,一样的话 minstack 也 pop,不然不作操作。
代码
牛客:
import java.util.Stack;
public class Solution {
private Stack<Integer> onstack = new Stack<Integer>();
private Stack<Integer> minstack = new Stack<Integer>();
private int size;
private int min = Integer.MAX_VALUE;
public void push(int node) {
if(minstack.isEmpty()){
minstack.push(node);
} else if(node <= min()){ //这里一定要有等于号!!!
minstack.push(node);
}
onstack.push(node);
}
public void pop() {
int value = onstack.pop();
//当普通栈的栈顶值和最小值一样 最小值栈弹出
if(value == min()){
minstack.pop();
}
}
public int top() {
return onstack.peek();
}
public int min() {
return minstack.peek();
}
}
LeetCode:
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (minStack.isEmpty() || minStack.peek() >= x) {
minStack.push(x);
}
}
public void pop() {
int x = stack.pop();
if (!minStack.isEmpty() && minStack.peek() == x) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}