- 栈具有后进先出的特点,因此 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)