面试题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];
    }
};

猜你喜欢

转载自www.cnblogs.com/wzw0625/p/12726603.html
今日推荐