1, 题目

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

  1. push(x) —— 将元素 x 推入栈中。
  2. pop() —— 删除栈顶的元素。
  3. top() —— 获取栈顶元素。
  4. getMin() —— 检索栈中的最小元素。

示例:

  1. MinStack minStack = new MinStack();
  2. minStack.push(-2);
  3. minStack.push(0);
  4. minStack.push(-3);
  5. minStack.getMin(); --> 返回 -3.
  6. minStack.pop();
  7. minStack.top(); --> 返回 0.
  8. minStack.getMin(); --> 返回 -2.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2, 算法

  1. class MinStack() {
  2. /** initialize your data structure here. */
  3. val buffer = scala.collection.mutable.ArrayBuffer[Int]()
  4. var value = Int.MaxValue
  5. def push(x: Int): Unit = {
  6. value = value.min(x)
  7. buffer.append(x)
  8. }
  9. def pop(): Unit = {
  10. if (buffer.nonEmpty) {
  11. buffer.remove(buffer.length - 1)
  12. if (buffer.nonEmpty) {
  13. value = buffer.min
  14. } else {
  15. value = Int.MaxValue
  16. }
  17. } else {
  18. throw new NoSuchElementException()
  19. }
  20. }
  21. def top(): Int = {
  22. buffer.last
  23. }
  24. def getMin(): Int = {
  25. if (buffer.nonEmpty) {
  26. value
  27. } else {
  28. throw new NoSuchElementException()
  29. }
  30. }
  31. }
  1. class MinStack:
  2. def __init__(self):
  3. """
  4. initialize your data structure here.
  5. """
  6. self.buffer = []
  7. self.value = None
  8. def push(self, x: int) -> None:
  9. self.buffer.append(x)
  10. if self.value is not None:
  11. self.value = min(self.value, x)
  12. else:
  13. self.value = x
  14. def pop(self) -> None:
  15. if self.buffer:
  16. x = self.buffer.pop()
  17. if self.buffer:
  18. self.value = min(self.buffer)
  19. else:
  20. self.value = None
  21. return x
  22. def top(self) -> int:
  23. if self.buffer:
  24. return self.buffer[-1]
  25. def getMin(self) -> int:
  26. if self.value is not None:
  27. return self.value