LeetCode-155. 最小栈(C++)

目录捏

  • 一、题目描述
  • 二、示例与提示
  • 三、思路
  • 四、代码


一、题目描述

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

实现 MinStack 类:

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

二、示例与提示

示例 1:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

提示

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104

三、思路

一开始会把本题想简单了,用一个变量记录最小值即可解决问题,后来发现如果要是弹出了这个最小值的话,我们还要记录次小值,若再弹出次小值的话,我们又要记录次次小值,这样下去可能要记录整个栈中的所有数。

再审一次题,题目要求我们设计一个能在常数时间内检索到最小元素的栈,所以我们绝不能在需要最小值的时候,再做排序、查找等操作来获取最小值。


因此,我们可以创建两个栈,一个栈是主栈 stack,另一个是辅助栈 minStack,与主栈同步插入与删除,用于存放对应主栈不同时期的最小值

  1. 当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值push辅助栈
  2. 当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出

这样, 在任意一个时刻,主栈内元素的最小值就存储在辅助栈的栈顶元素中。

四、代码

class MinStack {
public:
    stack<int>st;
    stack<int>min_st;
    // 注意:需要先向辅助栈中push一个最大值,以便后续向栈中push最小值
    MinStack() {
        min_st.push(INT_MAX);
    }
    
    void push(int val) {
        // 入栈需要比较出辅助栈栈顶与当前元素的最小值放入辅助栈中
        st.push(val);
        min_st.push(min(val, min_st.top()));
    }
    
    void pop() {
    	// 出栈需要把辅助栈的栈顶元素也一并弹出
        st.pop();
        min_st.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return min_st.top();
    }
};

复杂度分析

时间复杂度: O(1)

你可能感兴趣的:(力扣,leetcode,c++)