题目地址(30. 包含min函数的栈)

https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

题目描述

  1. 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 minpush pop 的时间复杂度都是 O(1)。
  2. 示例:
  3. MinStack minStack = new MinStack();
  4. minStack.push(-2);
  5. minStack.push(0);
  6. minStack.push(-3);
  7. minStack.min(); --> 返回 -3.
  8. minStack.pop();
  9. minStack.top(); --> 返回 0.
  10. minStack.min(); --> 返回 -2.
  11. 提示:
  12. 各函数的调用总次数不超过 20000
  13. 注意:本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/

前置知识


公司

  • 暂无

思路

这道题考察的是实现 空间复杂度O(1)的情况来实现一个min函数
正常要找到一个最小值 需要遍历整个栈 但是我们可以使用一个辅助栈来完成
每次在栈中添加一个新元素的时候 如果这个值是最小值 就把他加到stackmin中 如果不是 就把之前的最小值再添加一次
这样随时都可以知道最小值是什么了

关键点


代码

  • 语言支持:Java

Java Code:

  1. import java.util.Stack;
  2. class MinStack {
  3. /** initialize your data structure here. */
  4. Stack<Integer> stack;
  5. Stack<Integer> stackMin;
  6. public MinStack() {
  7. stack = new Stack<Integer>();
  8. stackMin = new Stack<Integer>();
  9. stackMin.push(Integer.MAX_VALUE);
  10. }
  11. public void push(int x) {
  12. stack.push(x);
  13. if (x < stackMin.peek()) {
  14. stackMin.push(x);
  15. }else{
  16. stackMin.push(stackMin.peek());
  17. }
  18. }
  19. public void pop() {
  20. stack.pop();
  21. stackMin.pop();
  22. }
  23. public int top() {
  24. return stack.peek();
  25. }
  26. public int min() {
  27. // if(stackMin.peek() == Integer.MAX_VALUE){
  28. // return
  29. // }
  30. return stackMin.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. */

复杂度分析

令 n 为数组长度。

  • 时间复杂度:剑指 Offer 30. 包含min函数的栈 - 图1#card=math&code=O%28n%29&id=w6CHV)
  • 空间复杂度:剑指 Offer 30. 包含min函数的栈 - 图2#card=math&code=O%28n%29&id=Z9E4R)