最小棧

原題

  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.算法

題目大意

  設計一個棧,支持push,pop,top,和查找最小的元素操做(常量時間)spa

解題思路

  使用一個輔助棧來保存棧中的最小元素。.net

代碼實現

算法實現類設計

public class MinStack {

    private final static int DEFAULT_SIZE = 1000;
    private int[] stack;
    private int[] minIndex; // 用於保存前n個數據的棧中最小元素的下標
    private int min = Integer.MAX_VALUE; // 用於記錄插入過程當中的最小數據
    private int index = -1; // 記錄最小元素在stack中的位置
    private int current = -1;

    public MinStack() {
        stack = new int[DEFAULT_SIZE];
        minIndex = new int[DEFAULT_SIZE];
    }

    public MinStack(int size) {
        stack = new int[size];
        minIndex = new int[size];
    }

    public void push(int x) {
        current++; // 移動到要插入的位置

        if (current >= stack.length) { // 擴容
            int[] tmp = new int[current * 2];
            System.arraycopy(stack, 0, tmp, 0, stack.length);
            stack = tmp;

            tmp = new int[current * 2];
            System.arraycopy(minIndex, 0, tmp, 0, minIndex.length);
            minIndex = tmp;
        }

        stack[current] = x; // 插入數據

        if (x < min) { // 保存插入的最小值
            min = x;
            index = current; // 記錄[0, current]中最小的元素下標是index
        }

        minIndex[current] = index;
    }

    public void pop() {
        current--;
        if (current >= 0) {
            min = stack[minIndex[current]]; // 從新設置棧中的最小值
            index = minIndex[current]; // 重置最小值的索引
        }
    }

    public int top() {

        if (current < 0) {
            throw new RuntimeException("No more data");
        }

        return stack[current];
    }

    public int getMin() {
        if (current < 0) {
            throw new RuntimeException("No more data");
        }

        return stack[minIndex[current]];
    }
}
相關文章
相關標籤/搜索