剑指offer 30.包含min函数的栈

该博客介绍了如何在O(1)的时间复杂度下,使用两个栈实现一个带有push、pop、top和获取最小值min功能的数据结构。核心思路是在push元素时比较并存储当前最小值,确保min栈始终包含栈内最小元素。代码以C++实现,通过维护两个栈,实现了高效且简洁的解决方案。
摘要由CSDN通过智能技术生成

题目地址

解题思路

要实现栈的push()pop()操作非常简单,直接st.push()st.pop()就好。

但是如何在O(1)的情况下返回栈的最小元素值呢?

想到:每次向栈里面push新元素的时候,我们取当前栈中最小的元素和新元素进行对比,然后择小,将其push进一个只存放(阶段小元素)的栈st_min中。

这样一来,栈st_min中的top()永远存放的是栈的最小元素。当我们需要返回最小元素时,只需要return st_min.top();

代码实现(C++)

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> st1;
    stack<int> st_min;
    MinStack() 
    {
        st_min.push(INT_MAX);
    }
    
    void push(int x) 
    {
        st1.push(x);
        st_min.push(std::min(st_min.top(),x));  //这里不能直接调用min函数,因为在下面重写了,需要写成std::min()
    }
    
    void pop() 
    {
        //如何处理pop这个操作其实也很关键
        //我们每次push元素的时候,都是把要push的元素和当前栈中最小的元素做对比,择小的push进去st_min
        //而当我们要pop元素时,我们会遇到两种情况:
        //1.st1中的top元素和我们st_min中的top元素相同(此时无需考虑,直接pop即可)  
        //2.st1中的top元素比我们st_min的top元素要大(也就是说st_min中的最小元素值最少有一个备份,所以也是直接pop即可)
        
        st1.pop();
        st_min.pop();
    }
    
    int top()  
    {
        return st1.top();
    }
    
    int min() 
    {
        return st_min.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值