Min Stack

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.

class MinStack {
    public void push(int x) {
        
    }

    public void pop() {
        
    }

    public int top() {
        
    }

    public int getMin() {
        
    }
}

分析:
设计一个最小的栈结构。支持push,pop,top,返回最小元素(常数时间内)。
从所给代码看,是一个整型的栈,有两个思路。
1,使用一个整数数组,当push时栈长大于数组长1/2,数组长度resize一倍。
pop时,栈长度小于size的1/4,数组长度减半。
2,使用链表实现,可以省下长度调整。prefer
其在java中分别代表了ArrayList 和  LinkedList.  我们直接使用了。


因为需要常数时间返回最小值,可以保存最小的node的指针,
不过push的时候要对比更新该指针。
pop的时候,如果pop的是该node。则需要重新遍历链表,更新该指针。

更好的方法是,

	Stack<Integer> stack = new Stack<Integer>();
	Stack<Integer> min = new Stack<Integer>();

	public void push(int x) {
		stack.push(x);
		if (min.empty() || min.peek() > x) {
			min.push(x);
		}
	}

	public void pop() {
		int top = stack.peek();
		stack.pop();
		if (top == min.peek()) {
			min.pop();
		}

	}

	public int top() {
		return stack.peek();
	}

	public int getMin() {
		return min.peek();
	}



巧妙的是利用一个stack来存储最小值。如果下一次入栈的值小于等于min的top,则min入栈。

pop的时候,min入栈过该元素的话,一定要出栈,如何判断之前该值入栈了呢?

如果该值等于栈顶,则肯定入栈过了,肯定不可能小于栈顶。如果大于栈顶,说明当时入栈的时候,直接略过了,没在min栈中。这样可以实现常数时间内来操作。


你可能感兴趣的:(算法)