如何在O(1)内找到实时序列的最小值?

开发 前端
最小栈,能在O(1)内找到栈内序列的最小值,因此此特性经常用于提升算法性能。下面看看它的一种实现。

最小栈

最小栈,能在O(1)内找到栈内序列的最小值,因此此特性经常用于提升算法性能。下面看看它的一种实现。

[[395237]]

分析过程

入栈分析:

推入元素到 mainstack,只有当当前元素小于tmpstack栈顶(实际存储为mainstack中元素索引)元素时,才入栈到tmpstack,入栈的是索引。

假设mainstack当前有n个元素,则tmpstack内元素至多有n个。等于n时,表明原入栈序列为单调递减序列。

出栈分析:

元素从mainstack出栈,但要注意出栈元素索引是否等于tmpstack栈顶,若是需要将tmpstack栈顶元素出栈。可以预知,栈顶索引一定小于等于出栈元素(在mainstack栈内)的索引。

这道题需要注意两点:

  • 临时栈里推送的是主栈的元素索引
  • push时若临时栈为空,需要先推入此元素在主栈索引

代码

  1. class MinStack(object): 
  2.     def __init__(self): 
  3.  
  4.         """ 
  5.         initialize your data structure here. 
  6.         """ 
  7.         self.mainstack= [] 
  8.         self.tmpstack = [] 

推入元素:

  1. def push(self, val): 
  2.  
  3.     """ 
  4.     :type val: int 
  5.     :rtype: None 
  6.     """ 
  7.  
  8.     self.mainstack.append(val) 
  9.  
  10.     if not self.tmpstack: 
  11.  
  12.         self.tmpstack.append(len(self.mainstack)-1) 
  13.  
  14.     # smaller than top of tmpstack 
  15.     if self.mainstack[self.tmpstack[-1]] > val: 
  16.  
  17.         self.tmpstack.append(len(self.mainstack)-1)  

出栈元素:

  1. def pop(self): 
  2.     """ 
  3.     :rtype: None 
  4.     """ 
  5.  
  6.     # min val of tmp stack equals top of mainstack 
  7.     if self.tmpstack and self.tmpstack[-1] == len(self.mainstack)-1: 
  8.         self.tmpstack.pop() 
  9.  
  10.     return self.mainstack.pop() 
  1. def top(self): 
  2.     """ 
  3.     :rtype: int 
  4.     """ 
  5.  
  6.     if self.mainstack: 
  7.         return self.mainstack[-1] 

使用tmpstack辅助栈,换来了O(1)的查询最小复杂度

  1. def getMin(self): 
  2.     """ 
  3.     :rtype: int 
  4.     """ 
  5.  
  6.     if self.tmpstack: 
  7.         return self.mainstack[self.tmpstack[-1]] 

 

责任编辑:赵宁宁 来源: Python与算法社区
相关推荐

2020-10-13 08:53:04

算法最小值

2010-09-26 16:12:57

SQL查询

2010-09-26 15:56:59

SQL查询

2009-09-17 09:50:34

数组

2010-05-27 14:27:30

MySQL全文索引

2017-07-03 10:52:20

深度学习人工智能

2010-10-12 14:27:57

mysql全文索引

2022-04-06 09:28:04

漏洞SQL注入

2010-11-24 16:42:40

mysql命令行求最小

2019-01-08 15:11:50

最大值最小值算法

2021-05-09 22:41:43

Python数据统计

2018-05-28 11:10:08

Linux命令IP地址

2019-02-26 10:15:13

GitHub 开源代码

2020-05-22 11:16:49

云安全云计算

2021-02-03 10:43:54

Linux系统磁盘

2020-10-12 11:16:32

数组特定值元素

2018-10-17 09:20:31

Linux命令重复文件

2009-04-10 13:48:17

JavaScripteval全局代码

2021-08-30 13:08:54

Linux实时监控日志文件

2018-03-01 09:46:11

游戏实时语音
点赞
收藏

51CTO技术栈公众号