首页>>后端>>java->如何在O(1)内找到实时序列的最小值?

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

时间:2023-12-07 本站 点击:0

最小栈 最小栈,能在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]]

以上就是本次分享的所有内容,想要了解更多欢迎前往公众号:Python 编程学习圈,每日干货分享

原文:https://juejin.cn/post/7102656756840398885


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/18653.html