最小栈
题目
155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
示例 1:
输入:
["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.
提示:
-231 <= val <= 231 - 1
pop、top 和 getMin 操作总是在 非空栈 上调用
push, pop, top, and getMin最多被调用 3 * 104 次
题解
题解一(数组)
要我说,本体就不应该写,垃圾题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class MinStack {
private final Integer[] stack; private Integer top; private Integer min; private int size;
public MinStack() { this.size = -1; this.stack = new Integer[30000000]; this.top = -1; this.min = Integer.MAX_VALUE; }
public void push(int val) { top = val; min = Math.min(min, val); size ++; stack[size] = val; }
public void pop() { stack[size] = null; size--; if(size == -1){ top = null; min = Integer.MAX_VALUE; return; } min = Integer.MAX_VALUE; top = stack[size]; for (int i = 0; i <= size; i++) { min = Math.min(min, stack[i]); } }
public int top() { return this.top; }
public int getMin() { return this.min; } }
|

题解二(链表)
此解法为本题最优解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class MinStack { class DNode{ int val; int min; DNode next; DNode(int val){ this.val = val; min = val; } DNode(){} } DNode head; public MinStack() { head = new DNode(); head.next = null; } public void push(int val) { DNode node = new DNode(val); DNode t = head.next; if(t==null){ head.next = node; node = null; return; } node.min = Math.min(node.min, t.min); node.next = head.next; head.next = node; } public void pop() { head.next = head.next.next; } public int top() { return head.next.val; } public int getMin() { return head.next.min; } }
|

题解三
官方题解,用栈实现栈,题解简直就是一坨💩💩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class MinStack { Deque<Integer> xStack; Deque<Integer> minStack;
public MinStack() { xStack = new LinkedList<Integer>(); minStack = new LinkedList<Integer>(); minStack.push(Integer.MAX_VALUE); } public void push(int x) { xStack.push(x); minStack.push(Math.min(minStack.peek(), x)); } public void pop() { xStack.pop(); minStack.pop(); } public int top() { return xStack.peek(); } public int getMin() { return minStack.peek(); } }
|