剑指offer20_包含min函数的栈_题解

包含min函数的栈

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数 时间复杂度应为\(O(1)\)

分析

方案一:辅助栈

数据栈 A : 栈 A 用于存储所有元素,保证入栈 push() 函数、出栈 pop() 函数、获取栈顶 top() 函数的正常逻辑。
辅助栈 B : 栈 B 中存储栈 A 中所有 非严格降序 的元素,则栈 A 中的最小元素始终对应栈 B 的栈顶元素,即 min() 函数只需返回栈 B 的栈顶元素即可。

/**
时间复杂度:O(1)
push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
空间复杂度:O(N)
当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N 个元素,使用 O(N) 额外空间。
**/
//辅助栈
class Solution
{
public:
    stack<int> A, B;
    void push(int value)
    {
        A.push(value);
        // 若栈B为空或value<=栈B的栈顶元素,则将value压入栈B
        if (B.empty() || value <= B.top())
            B.push(value);
    }
    void pop()
    {
        // 栈A出栈,将出栈元素保存到A_top中
        int A_top = A.top();
        A.pop();
        // 若出栈元素的值等于栈B的栈顶元素,则执行栈B出栈
        if (A_top == B.top())
            B.pop();
    }
    // 直接返回栈A的栈顶元素
    int top()
    {
        return A.top();
    }
    // 直接返回栈B的栈顶元素
    int min()
    {
        return B.top();
    }
};

方法二:单个栈

在push入栈时,判断当前元素是否小于最小值m,如果小于则将原最小值和最新的最小值相继入栈

在pop出栈时判断出栈元素是否等于最小值m,如果等于最小值m则将当前最小值指向栈顶元素并将栈顶元素出栈,这样就得到了下一个新的最小值了。

/**
时间复杂度:O(1)
push(), pop(), top(), min() 四个函数的时间复杂度均为常数级别。
空间复杂度:O(1)
当共有 N 个待入栈元素时,辅助栈 B 最差情况下存储 N 个元素,使用 O(N) 额外空间。
**/
// 单个栈
class Solution
{
public:
    stack<int> A;
    int m;
    void push(int value)
    {
        // 如果当前元素小于最小值,将原来最小值和最新的最小值相继入栈
        if (A.empty() || value <= m)
        {
            A.push(m);
            m = value;//更新最小值
        }
        A.push(value);
    }
    void pop()
    {
        // 如果出栈元素和当前最小值相等,则将栈顶元素出栈,更新当前最小值,然后再次出栈
        if (A.top() == m)
        {
            A.pop();
            m = A.top();
        }
        A.pop();
    }
    int top()
    {
        return A.top();
    }
    int min()
    {
        return m;
    }
};
posted @ 2020-12-19 11:57  RiverCold  阅读(51)  评论(0编辑  收藏  举报