zoukankan      html  css  js  c++  java
  • 面试题30: 包含min函数的栈(C++)

    题目地址:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

    题目描述

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

    题目示例

    示例:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.min(); --> 返回 -3.
    minStack.pop();
    minStack.top(); --> 返回 0.
    minStack.min(); --> 返回 -2.

    解题思路

    思路1:使用辅助栈arr_stack和min_stack分别用来存储数据和栈中最小值。具体步骤如下

    • Step1:每次push元素x时,直接将元素push到栈arr_stack中,然后判断栈min_stack是否为空,若为空,则将元素x压入栈min_stack中,否则,比较栈min_stack顶元素和压入元素的大小,如果压入元素x更小,则也需要将x压入栈min_stack。
    • Step2:返回栈顶元素时,需要判断栈min_stack和栈arr_stack的栈顶元素是否相同,若相同,则均弹出,否则,只弹出栈arr_stack的栈顶元素即可,栈min_stack不需要改变。
    • Step3:返回栈顶元素时,直接返回栈arr_stack的栈顶元素
    • Step4:返回最小元素时,我们直接返回栈min_stack的栈顶元素

    思路2:数组方法,使用两个数组解决,思路类似于双栈

    知乎大佬关于栈的一些题目:https://zhuanlan.zhihu.com/p/101265667

    程序源码

    辅助栈方法

    class MinStack {
    public:
        /** initialize your data structure here. */
        stack<int> arr_stack;
        stack<int> min_arr;
        MinStack() {
            
        }
        
        void push(int x) {
            
            arr_stack.push(x);
            if(min_arr.empty() || x <= min_arr.top())
            {
                min_arr.push(x);
            }
        }
        
        void pop() {
            if(arr_stack.top() == min_arr.top())
            {
                min_arr.pop(); //弹出最小值
            }
            arr_stack.pop();
        }
        
        int top() {
            return arr_stack.top();
        }
        
        int min() {
            return min_arr.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();
     */

    数组方法

    class MinStack {
    public:
        /** initialize your data structure here. */
        vector<int> arr;
        vector<int> min_arr;
        int min_cnt = 0;
        MinStack() {
            
        }
        
        void push(int x) {
            min_cnt = min_arr.size() ? std::min(x, min_arr[min_arr.size() - 1]) : x;
            min_arr.push_back(min_cnt);
            arr.push_back(x);
        }
        
        void pop() {
            min_arr.pop_back();
            arr.pop_back();
        }
        
        int top() {
            return arr[arr.size() - 1];
        }
        
        int min() {
            return min_arr[min_arr.size() - 1];
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    内置方法(item系列、__str__方法、__del__方法)
    POJ3436
    CF551B
    HDU1588
    HDU3117
    CF834D
    CF832D
    CF832C
    POJ1930
    POJ3666
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12726603.html
Copyright © 2011-2022 走看看