剑指 Offer 30. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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 次 注意:本题与主站 155 题相同:https://leetcode-cn.com/problems/min-stack/

解答

栈的操作基本没有变化 ,关键在于如何获取当前序列中最小的数。

最开始考虑使用最小堆,但是最小堆的弹出的时间复杂度达不到题目要求

我们从减少最小堆的不必要的存储和弹出的操作入手。如果当前push 的数据比最小堆的顶端最小数目大的话那么就不必push进入堆,

因为该数字push进容器内,它在容器内的存活周期中他的下面始终有一个存活周期比它长比他小的数字,所以它的push和pop是没有必要的

于是就可以大量减少最小堆的操作。

代码如下

class MinStack {public:    /** initialize your data structure here. */    stack<int>data;    priority_queue<int, vector<int>, greater<int>> minHeap;    MinStack() {    }    void push(int x) {        data.push(x);        if (minHeap.empty() || x <= minHeap.top() ) minHeap.push(x);    }    void pop() {        if (data.empty()) return;        int x = data.top(); data.pop();        if (x <= minHeap.top()) minHeap.pop();    }    int top() {        return data.top();    }    int min() {        if (!minHeap.empty())            return minHeap.top();        return -999999;    }};

进一步的优化,观察以上的堆的操作

堆的操作已经演变成一个只记录当前最小数字的单调栈了

那么直接使用两个栈就可以完成以上操作

========================================================================================

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

相关推荐

  • 每日一题 剑指offer(包含min函数的栈)

    编程是很多偏计算机.人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用.因此小白决定开辟一个新的板块"每日一题",通过每天一道编程题目来强化和锻炼自己的编程能力 ...

  • 剑指offer之两个队列实现栈的问题

    剑指offer之两个队列实现栈的问题

  • 剑指offer之判断链表是否包含环

    剑指offer之判断链表是否包含环

  • 剑指offer之找到链表里面包含环的入口节点

    剑指offer之找到链表里面包含环的入口节点

  • 【剑指Offer】数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 解法1 最直接的思路,计算base的 ...

  • 【剑指Offer】链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解法 基本思路是使用两个辅助指针p, q,让p先走k - 1步后,p, q两个指针再一起走 这样当p指针走到链表的末尾时,q指针刚好走到的就是倒数 ...

  • 【剑指Offer】反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 解法1 可以使用三个辅助指针pHead, last,next pHead记录当前节点,last记录上一个节点,next记录下一个节点 首先使用n ...

  • 剑指 Offer 14- I. 剪绳子

    我服了.动态规划杀我. 可以说一说解决动态规划的思路(只做了两三道就总结了emmm) 1.识别动态规划问题 --重叠子问题:大问题可以分为一个个子问题.和分治策略分割的子问题不同(分治问题的子问题是相 ...

  • 剑指offer

    03 数组中重复的数字 public int findRepeatNumber(int[] nums){ //排序后的数组,重复元素必然相邻 Arrays.sort(nums); //结果集 int ...