Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
构建一个最小栈。除了可以实现栈的出栈入栈、返回栈顶元素之外,还可以实现返回最小值。。实现栈的基本功能很简单,只需内部使用一个stack就行,但是要返回最小值就有点小复杂,因为每次出栈可能会影响最小值。。这里使用链表,每个节点中含有最小值信息,每添加一个节点,就将此节点的min设置为当前所有元素的最小值。因为是往表头添加元素,每次添加只需跟表头的节点的min进行比较,将两者最小的放进自己的节点中。
class MinStack { Node head; /** initialize your data structure here. */ public MinStack() { } public void push(int x) { if(head==null){ head=new Node(x,x); }else{
//这里是关键,一开始添加节点会将最小值信息放到第一个节点中,然后每次添加一个,会跟前面的节点的最小值比较,将较小的值放进自己节点,
//这样可以保证表头的节点中存放的是链表中的最小值信息。就算删除表头,下一个节点成为新表头,该节点中存放的剩下节点中的最小值。 head=new Node(x,Math.min(x,head.min),head); } } public void pop() { head=head.next; } public int top() { return head.val; } public int getMin() { return head.min; } private class Node{ private int val; private int min; private Node next; public Node(int val,int min){ this(val,min,null); } public Node(int val,int min,Node next){ this.val=val; this.min=min; this.next=next; } } } /** * 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(); */
根据上面的思路,也是可以使用栈和数组集合作为辅助,数组集合存放当前及以前元素的最小值。如下面代码,就是使用了一个数组集合,存放每个元素及之前所有元素的最小值。
当pop()时,最小值发生变化,此时只需list中删除最后一个就行。
class MinStack { Stack<Integer> stack; //使用一个数组集合,存放当前元素和之前元素的最小值。这个在每输入一个元素就可以判断了,当删除一个元素时,集合删除最后一个最小值 List<Integer> minList; public MinStack() { stack=new Stack<>(); minList=new ArrayList<>(); } public void push(int x) { if(stack.isEmpty()) { stack.push(x); minList.add(x); }else{ stack.push(x); minList.add(Math.min(x,minList.get(minList.size()-1))); } } public void pop() { if(stack.isEmpty()) return ; stack.pop(); minList.remove(minList.size()-1); } public int top() { return stack.peek(); } public int getMin() { return minList.get(minList.size()-1); } }