- 棧具有後進先出的特點,因此 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)