题目描述
解题思路
辅助栈
和此题一样https://www.yuque.com/jugelizi-rxt6d/dqbihl/iac9ha。
但也可以写成这样:
每次放入栈,同步的把最小值放入,就算重复也放入,注意同步!!!

class MinStack {Stack<Integer> stack;Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();minStack.push(Integer.MAX_VALUE);}public void push(int val) {stack.push(val);// 比较放入最小的值minStack.push(Math.min(minStack.peek(), val));}public void pop() {stack.pop();minStack.pop();}public int top() {return stack.peek();}public int getMin() {return minStack.peek();}}
差值法
使用了1个辅助栈,保存最小值,怎么可以实现不使用额外的空间呢?
栈保存差值,而使用一个变量来记录最小值,但需要注意出栈的时候,出栈需要对差值进行判断,如果diff小于0,那么min需要更新,大于0也需要更新。
/*** stack用来存储和min的差值,min存储最小值,每次出栈的时候通过差值和当前min计算要出栈的值和之前的min* 如果差值diff大于等于0,说明要出栈的值大于等于当前min,那么要出栈的值在入栈的时候没有更新min,返回min+diff;* 如果差值diff小于0,说明当前要出栈的值就是min(因为入栈的时候我们选择的就是min和入栈元素的最小值),同时,通过min-diff计算出之前min* 要注意的是diff可能会超出int范围,类似于 Integer.MAX_VALUE - 1 这种,所以diff要用Long存*/class MinStack {Integer min = null;Stack<Long> stack; // 保存差值,使用Long,防止越界public MinStack() {stack = new Stack<>();}public void push(int val) {if (stack.isEmpty()) {// 第一个数min=x,差值为0stack.push(0L);min = val;}else {stack.push(Long.valueOf(val) - min);min = Math.min(val, min);}}public void pop() {Long diff = stack.pop();if (diff < 0) {// 如果弹栈的小于min,那须需要把差值加上去,因为在放入的时候min = (int)(min - diff);}}public int top() {Long diff = stack.peek();if (diff >= 0) {return (int) (diff + min);}else {return min;}}public int getMin() {return min;}}
