【剑指offer30】【C++】包含min函数的栈【双栈&vector解法】

【剑指offer30】【C++】包含min函数的栈【双栈&vector解法】

  • 题目
  • 题解

关注公众号:【THU小鱼干杂货铺】
不间断分享LeetCode优质解题思路、大厂算法题解、学习资料等
在这里插入图片描述

题目

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.

提示:

各函数的调用总次数不超过 20000 次

题解

笔记:
双栈的思路:优点是在调用min()时时间复杂度可以在O(1)

1.利用两个栈,s负责普通栈的操作,push(),pop(),top(),min_s主要按序存储s中最小的元素.
2.维护min_s栈:
	2.1 当s.push(x),如果当前min_s为空||x元素<=min_s.top(),"≤"防止入栈的x值重复, min_s.push(x)
	2.2 当s.pop()时,如果pop的值和min_s.top()相等,那么min_s也pop()
3.调用min(),直接返回min_s.top();
4.调用top(),直接返回s.top();

vector的思路:调用min()时时间复杂度可以在O(N)

利用一个vector数组,vetcor<int> v;
1.入栈,v.push_back()
2.出战,v.pop_back()
3.返回栈首元素,v.back()
4.返回min元素,利用iterator遍历数组,返回最小的

代码:
双栈:

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s;
    stack<int> min_s;
    MinStack() {}
    
    void push(int x) {
        s.push(x);
        if(min_s.empty()||min_s.top()>=x)
            min_s.push(x);
    }
    
    void pop() {
        int tmp = s.top();
        s.pop();
        if(tmp==min_s.top()) min_s.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int min() {
        return min_s.top();
    }
};

vector:

class MinStack {
public:
    /** initialize your data structure here. */
    vector<int> v;
    MinStack() {}
    
    void push(int x) {
        v.push_back(x);
    }
    
    void pop() {
        v.pop_back();
    }
    
    int top() {
       return v.back();//返回最后一个元素
    }
    
    int min() {
        vector<int>::iterator it;
        int min_num;
        //min_num的初始化为v[0]
        if(!v.empty()) min_num = v[0];
        else return 0;
        for(it=v.begin();it!=v.end();it++){
            if(*it<min_num)
                min_num = *it;
        }
        return min_num;
    }
};

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

你可能感兴趣的:(C++,LeetCode,数据结构,算法,leetcode,c++)