如何用 O(1) 的時間複雜度求棧中最小元素

  • 棧具有後進先出的特點,因此 push 和 pop 只需要對棧元素進行操作。通過遍歷來查找最小元素的時間複雜度爲 O(1) ,那麼如何才能用 O(1) 的時間複雜度求棧中最小元素呢?
  • 採用空間來換取時間的方式來提高時間複雜度。具體實現爲,使用兩個棧結構,一個棧用來存儲數據,另一個用來存儲最小元素,當新加入的數據比最小元素還要小,就把這個元素壓如最小棧中,出棧時,如果出棧元素是當前最小元素,那麼把最小棧元素也同時出棧。
  • 代碼如下:

/**
 * 用 O(1) 查找棧內最小值
 */
public class MyStack3 {
    private Stack<Integer> elemStack = new Stack<>();
    private Stack<Integer> minStack = new Stack<>();

    public void push(int item) {
        elemStack.push(item);
        if (minStack.empty()) {
            minStack.push(item);
        } else {
            if (item < minStack.peek()) {
                minStack.push(item);
            }
        }
    }

    public Integer minItem() {
        if (minStack.empty()) {
            return Integer.MAX_VALUE;
        }
        return minStack.peek();
    }

    public int pop() {
        int topData = elemStack.pop();
        if (topData == minItem()) {
            minStack.pop();
        }
        return topData;
    }
}

  • 調用方式如下:
 	@Test
    public void test() {
        MyStack3 stack = new MyStack3();
        stack.push(3);
        System.out.println("最小元素爲" + stack.minItem());
        stack.push(5);
        System.out.println("最小元素爲" + stack.minItem());
        stack.push(2);
        System.out.println("最小元素爲" + stack.minItem());
        stack.pop();
        System.out.println("最小元素爲" + stack.minItem());
    }

這種方法是使用了額外的棧空間來存儲最小元素,從而達到了時間複雜度爲 O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章