棧實現:入棧、出棧、取最小元素的時間複雜度都是O(1)。
阿新 • • 發佈:2019-01-02
場景:
實現一個棧,帶有出棧(pop),入棧(push),取最小元素(getMin)三個方法。要保證這三個方法的時間複雜度都是O(1)。
方法一:
- 設兩個棧A/B,A:存放原始資料,B:棧頂為最小元素,其餘為最小元素的備胎;
- 入棧:
(1) 當第一個元素進入棧A時,索引“0”進入棧B。索引“0”所指即為棧A的當前最小值;
(2) 每當新元素進入棧A時,將新元素與B的棧頂元素(即棧A當前最小值)對比。若新元素小於B的棧頂元素,則新元素的下標進入棧B; - 出棧
當A有出棧時,若A棧頂元素的索引為B的棧頂元素(即,出棧元素為A的最小值),則B的棧頂元素出棧。出棧後,B的棧頂元素指向A原本第二小元素,即A當前最小元素。 取最小元素。
B的棧頂所指向的即為棧A的最小元素。
方法二:
使用帶有尾指標的單鏈表。
連結串列結點結構
class Node { int value; int min; Node *next; public Node(int value, int min) { this.value = value; this.min = min; } }
棧操作
class MinStack { Node *top; public MinStack(){ } // 入棧 public