剑指 Offer 30. 包含min函数的栈
方法一
使用两个栈。
class MinStack {Deque<Integer> stack = new ArrayDeque<>();Deque<Integer> stack_min = new ArrayDeque<>();public MinStack() {}public void push(int x) {stack.push(x);if(stack_min.isEmpty() || stack_min.peek() >= x){stack_min.push(x);}}public void pop() {int pop = stack.pop();if(pop == stack_min.peek()){stack_min.pop();}}public int top() {return stack.peek();}public int min() {return stack_min.peek();}
}
方法二
重复保存最小值: 当最小值要被替代的时候,将上一个最小值再加入一次栈,这样当当前最小值弹出时,还能找到上一个最小值。
class MinStack {Deque<Integer> stack = new ArrayDeque<>();int min = Integer.MAX_VALUE;public MinStack() {}public void push(int x) {if(x <= min){stack.push(min);min = x;} stack.push(x);}public void pop() {int pop = stack.pop();if(pop == min) min = stack.pop();}public int top() {return stack.peek();}public int min() {return min;}
}
方法三
保存当前值和最小值的差值: 当栈顶元素为负数的时候,表示上一个min被替换了,此时需要还原上一个min。
class MinStack {Deque<Long> stack = new ArrayDeque<>();long min = Integer.MAX_VALUE;public MinStack() {}public void push(int x) {if(stack.isEmpty()){min = x;stack.push(0L);}else{stack.push(x - min);if(x < min) min = x;}}public void pop() {long pop = stack.pop();if(pop < 0){ // 当栈顶元素为负数的时候,表示上一个min被替换了,此时需要还原上一个minmin = min - pop;}}public int top() {long pop = stack.peek();if(pop < 0){return (int) min;}else{return (int) (min + pop);}}public int min() {return (int) min;}
}