📅  最后修改于: 2023-12-03 15:12:46.746000             🧑  作者: Mango
这是一道门|门 IT 2007 的编程题,题号为第 65 题。它是一道经典资料结构和算法问题,要求实现一个栈,支持push(入栈)、pop(出栈)和getMin(返回栈中最小的元素),且这三个操作的时间复杂度均为O(1)。
我们可以使用两个栈来实现这个功能:一个栈用来存储数据,另一个栈用来存储最小值。具体实现方法如下:
首先,定义一个栈(名为stack)和一个辅助栈(名为minStack):
class MinStack {
Stack<Integer> stack = new Stack<>();
Stack<Integer> minStack = new Stack<>();
}
push操作时,向stack中压入元素,同时判断是否是最小值(即比minStack中的栈顶元素小或与其相等),如果是最小值则也将其压入minStack:
public void push(int val) {
stack.push(val);
if (minStack.isEmpty() || val <= minStack.peek()) {
minStack.push(val);
}
}
pop操作时,从stack中弹出元素,同时判断是否是最小值,如果是则同时从minStack中弹出:
public void pop() {
int val = stack.pop();
if (val == minStack.peek()) {
minStack.pop();
}
}
getMin操作时,直接返回minStack中的栈顶元素即可:
public int getMin() {
return minStack.peek();
}
我们可以发现,push、pop、getMin操作的时间复杂度均为O(1),空间复杂度为O(n)。这是一种很好的时间-空间权衡方案,可以在不降低时间复杂度的情况下,通过引入一定的空间开销实现更加高效的算法。
该算法适用于对查询操作(如求最值、求中位数等)要求比较高的场景,尤其适用于数据量较小的情况。同时,如果需要支持其他操作(如查找、删除等),则需要根据具体需求做出相应调整。