题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x)—— 将元素 x 推入栈中。pop()—— 删除栈顶的元素。top()—— 获取栈顶元素。getMin()—— 检索栈中的最小元素。数据
``` 输入: [“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.
<a name="7qy3t"></a># 解题思路采用一个 `List` 来实现栈,一个 `List` 来保存栈的信息:数据在栈中的位置,数据本身,栈的最小值对应的数据放在min末尾,如下图:-2,0,-3分别入栈后,min的变化<br />1. -2 入栈,-2在栈中的位置与值本身写入 `min` 中1. 0 入栈,由于-2比0大,所以在栈中,-2最小,因此需要把{1,0}插入到{0,-2}前,保证 `min` 末尾存储栈的最小值信息1. -3 入栈,由于-3是最小的,所以直接加在 `min` 末尾<a name="ppzGF"></a># 代码```javaimport java.util.ArrayList;import java.util.List;class MinStack {private List<Integer> data;private List<Node> min;/*** initialize your data structure here.*/public MinStack() {data = new ArrayList<>();min = new ArrayList<>();}public void push(int x) {data.add(x);if (min.isEmpty()) {min.add(new Node(0, x));} else {Node last = min.get(min.size() - 1);if (last.value < x) { //如果入栈的数比min末尾的数据大,则在min末尾前插入新入栈的数据min.set(min.size() - 1, new Node(min.size(), x));min.add(last);} else //如果入栈的数为最小值,直接插入min数组中min.add(new Node(min.size(), x));}}public void pop() {// 在min数组中,出栈的数据要么在末尾,要么在末尾-1的位置if (min.get(min.size() - 1).index == data.size() - 1) { //出栈的数据在min末尾min.remove(min.size() - 1);} else {Node last = min.get(min.size() - 1);min.set(min.size() - 2, last);min.remove(min.size() - 1);}data.remove(data.size() - 1);}public int top() {return data.get(data.size() - 1);}public int getMin() {return min.get(min.size() - 1).value;}class Node {public int index, value;public Node(int index, int value) {this.index = index;this.value = value;}}}/*** Your MinStack object will be instantiated and called as such:* MinStack obj = new MinStack();* obj.push(x);* obj.pop();* int param_3 = obj.top();* int param_4 = obj.getMin();*/
