📜  门|门 IT 2007 |第 65 题(1)

📅  最后修改于: 2023-12-03 15:12:46.746000             🧑  作者: Mango

门|门 IT 2007 |第 65 题

这是一道门|门 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)。这是一种很好的时间-空间权衡方案,可以在不降低时间复杂度的情况下,通过引入一定的空间开销实现更加高效的算法。

使用场景

该算法适用于对查询操作(如求最值、求中位数等)要求比较高的场景,尤其适用于数据量较小的情况。同时,如果需要支持其他操作(如查找、删除等),则需要根据具体需求做出相应调整。