leetcode:155. 最小栈

题目

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例:

  1. 输入:
  2. ["MinStack","push","push","push","getMin","pop","top","getMin"]
  3. [[],[-2],[0],[-3],[],[],[],[]]
  4. 输出:
  5. [null,null,null,null,-3,null,0,-2]
  6. 解释:
  7. MinStack minStack = new MinStack();
  8. minStack.push(-2);
  9. minStack.push(0);
  10. minStack.push(-3);
  11. minStack.getMin(); --> 返回 -3.
  12. minStack.pop();
  13. minStack.top(); --> 返回 0.
  14. minStack.getMin(); --> 返回 -2.

解答 & 代码

  1. class MinStack {
  2. private:
  3. stack<int> dataS; // 数据栈
  4. stack<int> minS; // 最小值栈,栈顶元素值代表当前数据栈中的最小元素值
  5. public:
  6. MinStack() {
  7. }
  8. void push(int val) {
  9. dataS.push(val);
  10. if(minS.empty() || minS.top() > val)
  11. minS.push(val);
  12. else
  13. minS.push(minS.top());
  14. }
  15. void pop() {
  16. if(!dataS.empty())
  17. dataS.pop();
  18. if(!minS.empty())
  19. minS.pop();
  20. }
  21. int top() {
  22. return dataS.empty() ? -1 : dataS.top();
  23. }
  24. int getMin() {
  25. return minS.empty() ? -1 : minS.top();
  26. }
  27. };
  28. /**
  29. * Your MinStack object will be instantiated and called as such:
  30. * MinStack* obj = new MinStack();
  31. * obj->push(val);
  32. * obj->pop();
  33. * int param_3 = obj->top();
  34. * int param_4 = obj->getMin();
  35. */

复杂度分析:总操作数 N

  • 时间复杂度:每个操作的时间复杂度均为 O(1)
  • 空间复杂度 O(N):若 N 个操作都为插入,则栈的空间复杂度 O(N)

执行结果:

  1. 执行结果:通过
  2. 执行用时:20 ms, 在所有 C++ 提交中击败了 72.20% 的用户
  3. 内存消耗:16 MB, 在所有 C++ 提交中击败了 33.78% 的用户