其他分享
首页 > 其他分享> > 剑指offer#30

剑指offer#30

作者:互联网

题目如下


这道题要求min(),push(),pop()的时间复杂度都是O(1),只用一个栈是实现不了的,为什么?栈的最明显的特点就是:最后进去的元素最新出来。用一个栈的话,每次都要确保最小的元素在栈顶,但最后进栈的元素不保证都是最小的,所以用一个栈就实现不了。本题要求的时间复杂度的最优,那可以用空间换时间的思想,借助一个辅助栈来实现它。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int>stack1;//第一次报错是因为我把s写成大写的了
    stack<int>stack2;
    int back1;
    int back2;
    MinStack() {
        while (!stack1.empty())
            stack1.pop();
        while (!stack2.empty())
            stack2.pop();
    }
    
    void push(int x) {
        stack1.push(x);
        if (stack2.size() == 0 || stack2.top() > x)
            stack2.push(x);
        else
            stack2.push(stack2.top());//如果新入栈的元素没有比辅助栈的栈顶元素小,就把辅助栈的栈顶元素再次压进辅助栈中去,确保数据栈中的元素数量和辅助栈中的元素数量保持一致
    }
    
    void pop() {
        if (!stack1.empty() && !stack2.empty())
        {
            stack1.pop();
            stack2.pop();
        }
       
    }
    
    int top() {
        if (!stack1.empty())
        {
            back1 = stack1.top();
        }
        return back1;
    }
    
    int min() {
        if (!stack2.empty())
        {
            back2 = stack2.top();
        }
        return back2;
    }
};

/**
 * 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();
 */

这题是我今日待办事项的第一件事(其实是开始刷剑指第一天的题目,今天是第三天,昨天没有写),我就是严格按照视频里说的,先开始再说,每次做一点,而且要在多巴胺充足的时候做,没有拖泥带水,我一上来就是先看剑指这书(图书馆的)的解释,然后看看吴师兄的解析(也没啥的),然后就开始写了,没有很痛苦,我也不想去看吴师兄的题解,因为他是用java写的(又在乎语言了。。。),C++yyds.

标签:offer,int,top,30,pop,stack2,empty,stack1
来源: https://www.cnblogs.com/sixiaoxiaoya/p/15808979.html