cc++ leetcode 155.最小栈

c/c++ leetcode 155.最小栈

题目描述:

155. 最小栈

难度简单634

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

解法一:双栈

class MinStack {
    stack<int> s;
    stack<int> minStack;
    int t;
public:
    /** initialize your data structure here. */
    MinStack() {
        //先在最小栈里存放int 类型的最大数值//如果不存,也是可以的,需要加一个minStack.empty()的判断
        //如果为空x就不需要与minStack判断
        minStack.push(INT_MAX);
    }
    
    void push(int x) {
        s.push(x);
        //如果最小栈的栈顶元素小于x 就再次把最小栈的栈顶元素进栈 否则就把x 进栈
        minStack.push(min(minStack.top(),x));
    }
    
    void pop() {
        s.pop();
        minStack.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int getMin() {
       return minStack.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->getMin();
 */

另一个版本

国外友人的杰作链接:https://leetcode.com/problems/min-stack/discuss/49016/C%2B%2B-using-two-stacks-quite-short-and-easy-to-understand

class MinStack {
private:
    stack<int> s1;
    stack<int> s2;
public:
    void push(int x) {
	    s1.push(x);
	    if (s2.empty() || x <= getMin())  s2.push(x);	    
    }
    void pop() {
        //在这里判断一下就是s2最小栈 二个栈中栈顶元素相同最小栈中的元素才会出栈;
	    if (s1.top() == getMin())  s2.pop();
	    s1.pop();
    }
    int top() {
	    return s1.top();
    }
    int getMin() {
	    return s2.top();
    }
};

时空复杂度分析:

时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)。因为栈的插入、删除与读取操作都是 O(1),插入和删除也都是常数级别的时间复杂度;

空间复杂度 :N 为进栈的最多的个数。最坏情况下,光进栈不出栈,此时两个栈占用的空间为 O(2n)去掉常数 也就是O(N);

解法二.用一个栈来存储一个键值对

这也是一个国外友人的一个杰作链接:https://leetcode.com/problems/min-stack/discuss/49221/C%2B%2B-solution-using-pair-and-one-stack

也是一个对于STL熟悉的老手了

class MinStack {
     stack<pair<int, int>> st;

public:
    void push(int x) {
        int min;
        if (st.empty()) {
            min = x;
        }
        else {
            min = std::min(st.top().second,x);
        }
        st.push({x, min});
    }

    void pop() {
        st.pop();
    }

    int top() {
        return st.top().first;
    }

    int getMin() {
        return st.top().second;
    }
};

时间复杂度都一样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值