剑指Offer30——包含min函数的栈

1. 题目简述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度是O(1)。

2. 题目分析

一个普通的栈push及pop操作时间复杂度均为O(1),但寻找最小元素的复杂度则为O(n)。关键之处就在于如何把寻找最小元素操作min的复杂度减小为O(1)。在这里我们采用双栈的解法,栈A与普通栈无异,栈B则存储栈A中非严格降序元素。由于栈B内元素是递降的,而其是从栈A全部元素依次筛选出来的,其栈顶元素就是栈A内元素最小值。

疑问解析:为什么栈B是非严格降序的呢?其不能是严格降序的吗?

这是由我们的pop操作决定的,若栈A顶元素和栈B顶元素相同,则将其弹出,如果栈B是严格递降的,意味着与栈B顶相等的元素没有push进栈B。我们不妨假设进入栈A的元素全是3,那么此时栈B仅一个元素3,栈A在pop时,栈B也要pop,那么栈B为空,此时无法得到最小元素。

栈B的解析:

栈B为什么能被构造出来呢?

引用自:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/mian-shi-ti-30-bao-han-minhan-shu-de-zhan-fu-zhu-z/

栈A从空开始,依次push元素,若栈A为空,则元素也push进栈B。若栈A不空,若push进的元素小于或等于栈B顶元素,则push进栈B,否则不操作。这样可以保证栈B一定会被构造出来且是不严格递减的。

3. 代码参考

class MinStack {
Deque<Integer> stack;
Deque<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new ArrayDeque<>();
minStack = new ArrayDeque<>();
} public void push(int x) {
stack.push(x);
// 这个判断写的很精巧
if (minStack.isEmpty() || minStack.peek() >= x) {
minStack.push(x);
}
} public void pop() {
int x = stack.pop();
if (x == minStack.peek()) minStack.pop();
} public int top() {
return stack.peek();
} public int min() {
return minStack.peek();
}
} /**
* 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();
*/

剑指Offer30——包含min函数的栈的更多相关文章

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

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.   思路: 这个题是想得到一个时间复杂度为O(1)的min函数,所以应用一个辅助栈,压的时候,如果A栈的压入比B栈压入 ...

  2. 剑指offer——包含min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度为O(1)) 该题是自己第一次采用编程的方式来实现Java中栈的功能,故直接借鉴了大牛的代码 import ...

  3. 剑指offer--27.包含min函数的栈

    时间限制:1秒 空间限制:32768K 热度指数:252822 本题知识点: 栈 算法知识视频讲解 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为 ...

  4. python剑指offer 包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). # -*- coding:utf-8 -*- class Solution: def ...

  5. 剑指Offer-20.包含min函数的栈(C++/Java)

    题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 分析: 因为题目要求得到栈中最小元素的min函数时间复杂度为O(1),这里便不选择遍历栈 ...

  6. 用js刷剑指offer(包含min函数的栈)

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 牛客网链接 js代码 const stack1 = [] const stack2 = ...

  7. 剑指Offer19 包含min函数的栈

    /************************************************************************* > File Name: 19_MinInS ...

  8. 剑指:包含min函数的栈(min栈)

    题目描述 设计一个支持 push,pop,top 等操作并且可以在 O(1) 时间内检索出最小元素的堆栈. push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 get ...

  9. 剑指offer-包含min函数的栈20

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). class Solution: def __init__(self): self.st ...

随机推荐

  1. 学习Spring5必知必会(7)~Spring tx

    一.spring的事务管理 1.引出事务的经典例子:银行转账发生异常 ✿ 解决:把转出钱和转入钱的业务放到同一个事务空间. ■ 分析转账过程流程: ① 首先,获取 DataSource 对象: ② 其 ...

  2. ComboBox控件绑定数据源后,添加'请选择'或'全部'

    ComboBox控件绑定数据源后,添加'请选择'或'全部' 当使用ComboBox控件绑定数据源之后,通过Items 属性添加的数据是无效的,此时如果要在所有选项前添加 选项 ,则需要考虑从数据源下手 ...

  3. python中max使用key参数

    arr = [1,2,2,2,2,3,3,3] arr = collections.Counter(arr) b = max(arr.keys(),key = arr.get) 这个时候b为arr中元 ...

  4. Scala语法1

    目录 main方法和def 函数 变量,类型转换,字符串分割拼接 文件读写和JDBC 面向对象编程 继承 case类,最常用的 main方法和def 函数 package scala_01 /** * ...

  5. laravel 返回值

    先理解几个概念: StdClass 对象 => 基础的对象 Eloquent 模型对象 (Model 对象) => 和模型相关的类对象 Eloquent 集合 => 可以简单理解为对 ...

  6. Laravel 自定命令以及生成文件

    以创建service层为例子 1.执行命令 php artisan make:command ServiceMakeCommand 2.在app\Console\Commands 下就会多出一个 Se ...

  7. Goland 时间转换的那些事

    Goland 时间转换的那些事 在项目的开发过程中遇到的一个很有意思的时间转换问题 例子 假设有一个需求,是从数据库获取到了一个时间,然后需要把时间延后一天,再返回时间戳 得到伪代码 t := &qu ...

  8. pandas常用操作详解——数据运算(一)

    表与表之间的数据运算 #构建数据集df1=pd.DataFrame(np.random.random(32).reshape(8,4),columns=list('ABCD')) df2=pd.Dat ...

  9. LGP6667题解

    既然看到了这道"板子",那还是来写一下题解吧... 如果有机会希望能推一下 载谈binominial sum 的做法. \[\sum_{k=0}^nf(k)\binom n kx^ ...

  10. 9.Flink实时项目之订单宽表

    1.需求分析 订单是统计分析的重要的对象,围绕订单有很多的维度统计需求,比如用户.地区.商品.品类.品牌等等.为了之后统计计算更加方便,减少大表之间的关联,所以在实时计算过程中将围绕订单的相关数据整合 ...