剑指-30:包含min函数的栈

题目

定义栈的数据结构,
请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,
调用 min、push 及 pop 的时间复杂度都是 O(1)。

解题思路

  1. 使用 int 保存当前栈最小值,使 min() 调用时可以直接获取
    问题:若当前 pop() 是最小值,将最小值抛出后,无法找到新的最小值
  2. 解决第一步问题
    用一个新的栈放置最小数值的数据,长度与主栈相同。使主栈与最小值栈数据一一对应。
    剑指-30:包含min函数的栈
class MinStack {
public:

  stack<int> mainStack;
  stack<int> minStack;
  /** initialize your data structure here. */
  MinStack() {
      while(!mainStack.empty()) mainStack.pop();
      while(!minStack.empty()) minStack.pop();
  }
  
  void push(int x) {
      mainStack.push(x);
      if (!minStack.empty() && minStack.top() < x) // 当最小值栈为空,或者当前塞入的值不是最小值时,更改x为最小值
          x = minStack.top();
      minStack.push(x);
  }
  
  void pop() {
      mainStack.pop();
      minStack.pop();
  }
  
  int top() {
      return mainStack.top();
  }
  
  int min() {
      return minStack.top();
  }
};

多出了一个栈的空间,空间复杂度变为`O(n)`
  1. 优化第二步的空间
    • 栈顶元素需要跟当前最小值元素进行关联
    • 元素用一个指针指向该元素为栈顶时的最小元素
    • 待完善

剑指-30:包含min函数的栈

上一篇:@Valid和@Validated校验区别


下一篇:Ansible 变量