30 包含min函数的栈(举例让抽象问题具体化)

题目描述:

定义栈的数据结构(push/pop),请在该类型中实现一个能够得到栈中所含最小元素的min函数(三者的时间复杂度都应为O(1))。

测试用例:

1)新压入栈的数字比之前的最小值大/小

2)弹出的数字不是最小的元素/是最小的元素

解题思路:

1)借助辅助栈存储最小值,辅助栈顶一定都当前栈的最小值

class Solution {
public:
    void push(int value) {
        if(data.empty()){
            data.push(value);
            minValue.push(value);  // 是一样的A
        }else{ //不为空的时候要寻找最小值,添加到辅助栈中
            data.push(value);
            if(value<minValue.top())
                minValue.push(value);  // 是一样的A
            else
                minValue.push(minValue.top());
        }
        /*
        比较简单的判断方法
        data.push(value);
        if(data.empty() || value<minValue.top()){
             minValue.push(value);
        }else{
            minValue.push(minValue.top());
        }
        */
    }
    void pop() { //既要删除数据栈的栈顶元素,也要删除辅助栈的栈顶元素
        //assert(data.size()>0 && minValue.size()>0);
        if(data.empty())
            return;
        data.pop();//用判断栈为空么??
        minValue.pop();
    }
    int top() { //访问数据栈顶
        return data.top();
    }
    int min() { //访问辅助栈顶  考虑栈为空的时候
        //assert(data.size()>0 && minValue.size()>0);
        if(data.empty())
            return; //实际上应该报错
        return minValue.top();
    }

private:
    stack<int> data;
    stack<int> minValue;
};

2)使用key-value对存储

class Solution {
    typedef pair<int, int> pii;
    stack<pii> s;
public:
    void push(int value) {
        s.push(pii(value, ::min(value, s.empty() ? value : min()) )); //min()是自己定义的函数s.top().second;
    }
    void pop() {
        s.pop();
    }
    int top() {
        return s.top().first;
    }
    int min() {
        return s.top().second;
    }
};

  

  

原文地址:https://www.cnblogs.com/GuoXinxin/p/10449574.html

时间: 2024-10-10 08:27:32

30 包含min函数的栈(举例让抽象问题具体化)的相关文章

【剑指offer】【栈】30.包含min函数的栈

包含min函数的栈 维护两个栈:栈st存储所有元素,minSt是一个单调栈,栈顶元素为min 1. 入栈:st.push(x); 若minSt.top >= x或minSt为空,x入栈minSt 2. 出栈:若minSt与st栈顶元素相同,则二者都出栈,否则st出栈 3. 获取最小值:若minSt不为空,返回minSt栈顶元素 class MinStack { public: stack<int> st; stack<int> minSt; /** initialize yo

剑指Offer对答如流系列 - 包含min函数的栈

面试题30:包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 问题分析 push 和 pop均容易实现. 主要就是min函数的定义,如果要通过操作push和pop操作获取最小元素时间复杂度为O(1),基本上是不可能的. 如果我们另外定义一个成员变量 专门存储最小元素的值,但是当最小元素弹出后,min就需要相应改变,所以必须把每次的最小值都存储下来.这个时候不得不考虑采用一个辅助栈

包含min函数的栈-剑指Offer

包含min函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数 思路 使用一个辅助栈,跟踪原始栈中每个元素在栈口时的该栈的最小值 代码 import java.util.Stack; public class Solution { Stack<Integer> s_data = new Stack(); Stack<Integer> s_min = new Stack(); public void push(int node) { s_data.

微软100题系列之-----设计包含min函数的栈

题意: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1). 思路:定义两个栈,一个用来记录数据的插入和删除,一个用来存储最小值的变化 代码如下: template <class T> class Stack { public: Stack(int len=100); T Min(); T Pop(); void Push(T val); private: T top1,top2; T *stack1,*stack

【编程题目】设计包含 min 函数的栈

2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的元素记录最小值,push时若遇到更小的则更新.但是pop的时候遇到了问题,最小的弹出去了怎么得到下一个最小的值? 总觉得要排序,再存一个min的链.结果没达到O(1). /* 2.设计包含 min 函数的栈(栈) 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素. 要求函数 min

剑指offer系列源码-包含min函数的栈

题目1522:包含min函数的栈 时间限制:1 秒内存限制:128 兆特殊判题:否提交:1495解决:476 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci='o'时,弹出栈顶元素. 输出: 对应每个测

2.设计包含 min 函数的栈

http://zhedahht.blog.163.com/blog/static/25411174200712895228171/ http://blog.csdn.net/anchor89/article/details/6055412 http://blog.csdn.net/sgbfblog/article/details/7752878 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 解法一: 使用一个辅助栈来

包含min函数的栈 + 栈的压入、弹出序列

剑指offer 两道关于 数据结构——栈 的题目 1. 包含min函数的栈 简要分析一下这道题,这道题做了3遍才过,踩了一些小坑 看看示例: 得到了规律,那么关键部分的代码实现,就在于 两个栈(rawStack 和 minStack) 和 push() 方法 Stack<Integer> rawStack = new Stack<>(); Stack<Integer> minStack = new Stack<>(); public void push1(i

举例让抽象问题具体化:包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). import java.util.Stack; public class Solution { Stack<Integer> dataStack = new Stack<Integer>(); Stack<Integer> minStack = new Stack<Integer>(); public void push(i