トピック
分析する
この質問のpush
、pop
、およびtop
演算はすべて、Stack
や などのクラスでサポートできDeque
、それらの時間計算量は ですO(1)
。問題はgetMain
方法にあり、スタック内の最小要素を取得するために、最小値を見つけるためにスタック領域全体を走査する時間計算量が である場合、O(n)
時間計算量を最適化するために補助スタックが必要ですO(1)
。
プッシュ操作:
補助スタックの動作は元のスタックの動作と同じですが、補助スタックのデータの値は補助スタックの現在の値と同じpush
である最小值
内の最小値を取得するときに、peek
スタックの最上位データは補助スタックから直接取得できます。
補助スタックのステップは元のスタックのステップと同じであり、push
両方がpop
同期されて2 つのスタックの同じ動作が実現されます入栈
。操作は単純で、判断する必要はなく、2つのスタックを進めるだけで、絵を描く必要もありません。以下のコードを参照してください。出栈
pop
pop
コード
辅助栈初始化时需要写入一个最大值,否则第一次比对栈顶没有内容会报错。
class MinStack {
ArrayDeque<Integer> stack;
ArrayDeque<Integer> minStack;
public MinStack() {
stack = new ArrayDeque<>();
minStack = new ArrayDeque<>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int val) {
stack.push(val);
minStack.push(Math.min(minStack.peek(), val));
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}