LeetCode—155.最小栈(Min Stack)——分析及代码(C++)

LeetCode—155.最小栈[Min Stack]——分析及代码[C++]

  • 一、题目
  • 二、分析及代码
    • 1. 辅助栈
      • (1)思路
      • (2)代码
      • (3)结果
    • 2. 辅助map
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 辅助栈

(1)思路

在存储推入元素的主栈外,设计一个辅助栈用于存储各个位置对应的最小值。

由于栈只能先进后出,辅助栈的推入元素为:
1)新元素小于当前最小值,辅助栈推入新元素;
2)新元素大于等于当前最小值,辅助栈推入原最小值。

即当新元素不为当前序列最小值时,pop出该元素时不影响最小值(即辅助栈中同步pop了一个额外添加的最小值)。
此时 push、pop、top、getMin 复杂度均为 O(n)。

(2)代码

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> sta_num, sta_min; 

    MinStack() {}
    
    void push(int x) {
        if (sta_num.empty())
            sta_min.push(x);
        else 
            sta_min.push(sta_min.top() < x ? sta_min.top() : x);//辅助栈中推入原最小值和新元素中的小值
        sta_num.push(x);//元素推入主栈
    }
    
    void pop() {
        sta_num.pop();
        sta_min.pop();//辅助栈同步pop
    }
    
    int top() {
        return sta_num.top();       
    }
    
    int getMin() {
        return sta_min.top();
    }
};

(3)结果

执行用时 :36 ms, 在所有 C++ 提交中击败了 83.28% 的用户;
内存消耗 :16.9 MB, 在所有 C++ 提交中击败了 67.56% 的用户。

2. 辅助map

(1)思路

根据快速查找最小值的需求,想到可以用 map 进行辅助。
与主栈同步操作 map,map 存储的两个值分别对应 元素值 和 出现次数。
此方法在 插入、删除、查找 时理论上复杂度为 O(logn)。

(2)代码

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> sta;//主栈
    map<int, int> m;//辅助map

    MinStack() {}
    
    void push(int x) {
        sta.push(x);
        auto it = m.find(x);
        if (it != m.end())//map中已存在对应key:value++
            m[x]++;
        else//map中无对应元素:插入新元素
            m.insert({x, 1});
    }
    
    void pop() {
        int x = sta.top();
        sta.pop();
        if (--m[x] == 0)//map中该元素数量--,若剩余该元素数量为0:删除该元素
            m.erase(x);
    }
    
    int top() {
        return sta.top();       
    }
    
    int getMin() {
        return m.begin()->first;
    }
};

(3)结果

执行用时 :32 ms, 在所有 C++ 提交中击败了 94.43% 的用户;
内存消耗 :17.7 MB, 在所有 C++ 提交中击败了 5.04% 的用户。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法)