剑指 Offer 30. 包含min函数的栈

解题思路

本题是一道特殊的数据结构设计问题,要求我们设计出一个包含 stack.min() 方法的栈,并且要求 min,push,pop 这些方法的时间复杂度均为 O(1)

我的思路为,在这个最小栈中维护两个栈,一个是正常的实现存储数据功能的栈,命名为 dataStack,还有一个是专门用来维护此时栈中最小的元素的栈,命名为 minStack,该栈的栈顶始终存储栈中最小的元素

当我们向栈中压入一个数据时,dataStack 正常执行 push 操作;minStack 则是要比较压入的数据与栈顶元素的大小,如果新压入的数据比栈顶元素大,那么我们就将栈顶元素复制一份压入至 minStack 中,如果新压入的数据比栈顶元素小,那么我们就压入新的数据到 minStack 中,这样做的目的是时时维护 minStack 栈顶的元素是当前数据栈中最小的元素。

出栈操作就比较简单了,我们只需让 dataStack minStack 同步出栈即可。

代码

  1. class MinStack {
  2. private Stack<Integer> dataStack;
  3. private Stack<Integer> minStack;
  4. /** initialize your data structure here. */
  5. public MinStack() {
  6. dataStack = new Stack<>();
  7. minStack = new Stack<>();
  8. }
  9. public void push(int x) {
  10. if(dataStack.isEmpty()){
  11. dataStack.push(x);
  12. minStack.push(x);
  13. }else {
  14. dataStack.push(x);
  15. if(minStack.peek() < x){
  16. minStack.push(minStack.peek());
  17. }else {
  18. minStack.push(x);
  19. }
  20. }
  21. }
  22. public void pop() {
  23. minStack.pop();
  24. dataStack.pop();
  25. }
  26. public int top() {
  27. return dataStack.peek();
  28. }
  29. public int min() {
  30. return minStack.peek();
  31. }
  32. }
  33. /**
  34. * Your MinStack object will be instantiated and called as such:
  35. * MinStack obj = new MinStack();
  36. * obj.push(x);
  37. * obj.pop();
  38. * int param_3 = obj.top();
  39. * int param_4 = obj.min();
  40. */

复杂度分析

  • 时间复杂度:O(1)

push(),pop(),top(),min() 四种操作的时间复杂度均为 O(1)

  • 空间复杂度:O(N)

我们使用的辅助栈 minStack 使用了 O(N) 的额外空间