iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何在O(1)内找到实时序列的最小值
  • 790
分享到

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

2024-04-02 19:04:59 790人浏览 独家记忆
摘要

如何在O(1)内找到实时序列的最小值,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。最小栈最小栈,能在O(1)内找到栈内序列的最小值,因此此

如何在O(1)内找到实时序列的最小值,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

最小栈

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

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

分析过程

入栈分析:

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

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

出栈分析:

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

这道题需要注意两点:

  • 临时栈里推送的是主栈的元素索引

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

代码

class MinStack(object):     def __init__(self):          """         initialize your data structure here.         """         self.mainstack= []         self.tmpstack = []

推入元素:

def push(self, val):      """     :type val: int     :rtype: None     """      self.mainstack.append(val)      if not self.tmpstack:          self.tmpstack.append(len(self.mainstack)-1)      # smaller than top of tmpstack     if self.mainstack[self.tmpstack[-1]] > val:          self.tmpstack.append(len(self.mainstack)-1)

出栈元素:

def pop(self):     """     :rtype: None     """      # min val of tmp stack equals top of mainstack     if self.tmpstack and self.tmpstack[-1] == len(self.mainstack)-1:         self.tmpstack.pop()      return self.mainstack.pop()
def top(self):     """     :rtype: int     """      if self.mainstack:         return self.mainstack[-1]

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

def getMin(self):     """     :rtype: int     """      if self.tmpstack:         return self.mainstack[self.tmpstack[-1]]

关于如何在O(1)内找到实时序列的最小值问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网JavaScript频道了解更多相关知识。

--结束END--

本文标题: 如何在O(1)内找到实时序列的最小值

本文链接: https://www.lsjlt.com/news/81691.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作