package cn.fansunion.leecode.collection; import java.util.ArrayList; import java.util.List; /** * 155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 * * push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 * * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * * 思考:官方解法,看了,用2个栈,确实很妙;但是,感觉这样的解法有点无耻啊,充分利用题目的不确定性。 * 很多题目描述的不够清楚,用2个栈去实现1个栈,这不是瞎折腾吗?实际工作中,有几个这样的需求。 * @author [email protected] * * 2022-2-18 */ public class MinStack { private List elementList = new ArrayList<>(); private Integer min = null ; /*示例: 输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.*/ public MinStack() { } //每次push和pop时,更新min public void push( int val) { elementList.add(val); if (min!= null ) { min = Math.min(min, val); } else { min=val; } } public void pop() { if (elementList.isEmpty()) { return ; } Integer removed=elementList.remove(elementList.size() - 1 ); if (removed.equals(min)) { refreshMin(); } } private void refreshMin() { min=min(elementList); } private Integer min(List elementList) { if (elementList== null ||elementList.size()== 0 ) { return null ; } Integer min=elementList.get( 0 ); for (Integer num:elementList) { min=Math.min(min, num); } return min; } public int top() { if (elementList.isEmpty()) { throw new IllegalArgumentException( "no element" ); } return elementList.get(elementList.size() - 1 ); } public int getMin() { return min; } /** * Your MinStack object will be instantiated and called as such: MinStack obj = new MinStack(); obj.push(val); * obj.pop(); int param_3 = obj.top(); int param_4 = obj.getMin(); */ } |