面试中算法(最小栈)

最小栈的实现

      实现一个栈,该栈有出栈(pop)、入栈(push)、取最小元素(get_min) 。要保证时间复杂度都是O (1)。

第1步:设原有的栈叫作栈A,额外的“备胎”栈B,用于辅助栈A。

          当第1个元素进入栈A时,让新元素也进入栈 B。这个唯一的元素是栈A的当前最小值。

第2步:每当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素进入栈B,此时栈B的栈顶元素就是栈A当前最小值。

第3步:每当栈A有元素出栈时,如果出栈元素是栈A当前最小值,则让栈B的栈顶元素也出栈。此时栈B余下的栈顶元素所指向的是栈A中原本第2小的元素,代替刚才的出栈元素成为栈A的当前最小值。(备胎转正。)

第4步:当调用get_min方法时,返回栈B的栈顶所存储的值,这也是栈A的最小值。

class  StackMin:
    def __init__(self):
        '''
        初始化 栈A,栈B
        '''
        self.stack_a=[]
        self.stack_b=[]

    def push(self,newele):
        '''入栈'''
         #入栈A
         self.stack_a.append(newele)
         # 若栈B为空,或新元素的值小于或等于栈B栈顶元素的值,
         if len(self.stack_b)==0 or newele<=self.stack_b[len(self.stack_b)-1]:
             # #将新元素压入栈B
             self.stack_b.append(newele)

    def pop(self):
        '''出栈'''
        # 如果栈A出栈元素和栈B栈顶元素的值相等,栈B的栈顶元素出栈
        if self.stack_a[len(self.stack_a)-1]==self.stack_b[len(self.stack_b)-1]:
            self.stack_b.pop()   #出栈
        return self.stack_a.pop() #出栈

    def get_min(self):
        #判断栈A为空
        if(self.stack_a==0):
            return None
        #返回栈B的最小值
        return self.stack_b[len(self.stack_b)-1]


if __name__ == '__main__':
    #对象
    stack=StackMin()
    #入栈5,8,6,3,2,9
    stack.push(5)
    stack.push(8)
    stack.push(6)
    stack.push(3)
    stack.push(2)
    stack.push(9)
    print(stack.get_min())
    #出栈
    stack.pop() #2
    # stack.pop()  #3
    # stack.pop()  #5
    print(stack.get_min())

 显然进栈、出栈、取最小值的时间复杂度都是O(1)最坏情况空间复杂度是O(n)。

相关推荐

  1. 155.

    2024-05-03 02:52:03       37 阅读
  2. 面试算法-145-覆盖子串

    2024-05-03 02:52:03       8 阅读
  3. 】Leetcode 155. 【中等】

    2024-05-03 02:52:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-03 02:52:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-03 02:52:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-03 02:52:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-03 02:52:03       18 阅读

热门阅读

  1. 6、FreeCAD的设计

    2024-05-03 02:52:03       12 阅读
  2. MySQL-笔记-09.存储过程及触发器的使用

    2024-05-03 02:52:03       12 阅读
  3. fastjson组件的使用

    2024-05-03 02:52:03       10 阅读
  4. python 如何判断是函数还是方法 (function or method)

    2024-05-03 02:52:03       10 阅读
  5. windows版本的epoll

    2024-05-03 02:52:03       13 阅读
  6. 全面解析Unity至Unreal的项目迁移流程

    2024-05-03 02:52:03       12 阅读
  7. 常用的路径抽稀算法

    2024-05-03 02:52:03       9 阅读
  8. npm一篇通

    2024-05-03 02:52:03       12 阅读
  9. UML图(总结)

    2024-05-03 02:52:03       10 阅读
  10. WPF之ToolTip提示

    2024-05-03 02:52:03       13 阅读
  11. sklearn和torch计算的r2 score不一样

    2024-05-03 02:52:03       13 阅读
  12. asp爬虫代码简单示例

    2024-05-03 02:52:03       9 阅读
  13. [AI OpenAI-doc] 文件搜索 Beta

    2024-05-03 02:52:03       15 阅读
  14. Github2024-04-28php开源项目日报Top9

    2024-05-03 02:52:03       12 阅读