博客
关于我
【Leetcode】716. Max Stack
阅读量:226 次
发布时间:2019-02-28

本文共 1996 字,大约阅读时间需要 6 分钟。

题目地址:

用栈实现一个数据结构可以实现如下操作:

1、将数据进栈,出栈,并且按照FILO的原则;
2、查看栈顶,查看栈中最大值;
3、删掉栈中最大值。

基本思路是用两个栈,其中一个栈 s 1 s_1 s1存原本的数据,另开一个单调栈 s 2 s_2 s2,存所有遇到的最大值。这样即使在原栈中的最大值pop掉,也能通过在第二个栈里找到剩余数字的最大值。具体考虑如下:

1、push的时候,对于 s 1 s_1 s1只需直接进栈即可,对于 s 2 s_2 s2,要看一眼新来的数是否大于等于栈顶,如果是,则进栈,否则不进栈。这样的考虑在于记录当前栈中的最大值,注意,即使新来的数等于栈顶,仍然需要进栈,这是为了记录这个最大值出现了多少次;
2、pop的时候,对于 s 1 s_1 s1仍然是直接pop,对于 s 2 s_2 s2则需要看一下从 s 1 s_1 s1里pop的是否是当前最大值,如果是,则将 s 2 s_2 s2也pop,否则不动;
3、top和peekMax就直接看两个栈的栈顶即可;
4、对于popMax,需要先用一个变量存一下当前最大值是多少,也就是 s 2 s_2 s2的栈顶,然后另外开一个临时栈,把 s 1 s_1 s1上面的数字全倒进去,直到pop出 s 1 s_1 s1里的最大值,此时也要pop出 s 2 s_2 s2,然后再调用1里面的push方法把数字再进栈。注意,一定要调用MaxStack的push方法而不是调用 s 1 s_1 s1的push方法,这是因为倒出来的数字里可能有次大值,而那个单调栈只是存放了 s 1 s_1 s1从最大值到栈底的数字里的最大、次大等等值,并没有存放最大值到栈顶的数字信息;调用push的目的就是把这些信息也存到 s 2 s_2 s2里。代码如下:

import java.util.ArrayDeque;import java.util.Deque;public class MaxStack {           Deque
stk, maxStk; public MaxStack() { stk = new ArrayDeque<>(); maxStk = new ArrayDeque<>(); } public void push(int x) { stk.push(x); if (maxStk.isEmpty() || maxStk.peek() <= x) { maxStk.push(x); } } public int pop() { int x = stk.pop(); if (!maxStk.isEmpty() && x == maxStk.peek()) { maxStk.pop(); } return x; } public int top() { return stk.peek(); } public int peekMax() { return maxStk.peek(); } public int popMax() { Deque
tempStk = new ArrayDeque<>(); int x = maxStk.pop(); while (!stk.isEmpty() && stk.peek() < x) { tempStk.push(stk.pop()); } stk.pop(); while (!tempStk.isEmpty()) { // 调用MaxStack的push方法,把倒出来的数字再倒回去 push(tempStk.pop()); } return x; }}

空间 O ( n ) O(n) O(n),时间复杂度只有popMax是 O ( n ) O(n) O(n),其余都是 O ( 1 ) O(1) O(1)

算法正确性证明的关键在于,证明 s 2 s_2 s2存放的是 s 1 s_1 s1里从最大值到栈底的最大、次大等等值,出现次数一样并且单调递减排列。可以用数学归纳法,这里省略。

转载地址:http://dsds.baihongyu.com/

你可能感兴趣的文章
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>