python实现时间o(1)的最小栈的实例代码

 更新时间:2018年07月23日 09:41:18   作者:熔遁丶螺旋手里剑  
这篇文章主要介绍了python实现时间o(1)的最小栈的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

这是毕业校招二面时遇到的手写编程题,当时刚刚开始学习python,整个栈写下来也是费了不少时间。毕竟语言只是工具,只要想清楚实现,使用任何语言都能快速的写出来。

何为最小栈?栈最基础的操作是压栈(push)和退栈(pop),现在需要增加一个返回栈内最小值的函数(get_min),要求get_min函数的时间复杂度为o(1)。python的栈肯定是使用list实现,只要将list的append和pop封装到stack类中,即实现了压栈和退栈。如果不考虑时间复杂度,我们第一反应一定是min(),min()可以在不开辟新空间的情况下o(n)的返回栈内最小值。但是如果栈内元素很多,并且get_min方法需要频繁调用时,min高耗时的缺点就被放大,那么理想的方法就是空间换时间来降低时间复杂度。

我们的栈内存在stack_list和min_list,min_list负责存储栈内元素中最小值组成的栈,当新压栈的元素小于等于栈内最小的元素时,将新元素压入min_list。如果退栈的元素等于栈内最小的元素,那么也要将min_list退栈。举例子,我们依次压栈3,2,4,1

初始化

stack_list = []    
min_list = []

3压栈

stack_list = [3]
min_list = [3]

2压栈

stack_list = [3, 2]
min_list = [3, 2]

4压栈

stack_list = [3, 2, 4]
min_list = [3, 2]

1压栈

stack_list = [3, 2, 4, 1]
min_list = [3, 2, 1]

get_min只需要返回min_list中最后一个元素,以下是python代码的完整实现

#!/usr/bin/python
# -*- coding: utf-8 -*-

class stack(object):
  stack_list = []
  min_list = []
  min = None

  def push(self, x):
    if not self.stack_list:
      self.min = x
      self.min_list.append(self.min)
      self.stack_list.append(x)
      return
    self.stack_list.append(x)
    if self.min >= x:
      self.min = x
      self.min_list.append(self.min)
    return

  def pop(self):
    pop_result = None
    if self.stack_list:
      pop_result = self.stack_list[-1]
      if self.stack_list.pop() == self.min:
        self.min_list.pop()
        if self.min_list:
          self.min = self.min_list[-1]
        else:
          self.min = None
      return pop_result
    else:
      self.min = None
      return pop_result

  def print_stack(self):
    print "stack---->", self.stack_list
    return

  def get_min(self):
    return self.min

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • django admin管理工具自定义时间区间筛选器DateRangeFilter介绍

    django admin管理工具自定义时间区间筛选器DateRangeFilter介绍

    这篇文章主要介绍了django admin管理工具自定义时间区间筛选器DateRangeFilter介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 在k8s上部署pytorch分布式程序的完整步骤记录

    在k8s上部署pytorch分布式程序的完整步骤记录

    Kubernetes的核心优势在于其能够提供一个可扩展、灵活且高度可配置的平台,使得应用程序的部署、扩展和管理变得前所未有的简单下面这篇文章主要给大家介绍了关于在k8s上部署pytorch分布式程序的完整步骤,需要的朋友可以参考下
    2024-08-08
  • Python之列表实现栈的工作功能

    Python之列表实现栈的工作功能

    今天小编就为大家分享一篇关于Python之列表实现栈的工作功能,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • python读写二进制文件的方法

    python读写二进制文件的方法

    这篇文章主要介绍了python读写二进制文件的方法,实例分析了Python读写二进制文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • python 发送和接收ActiveMQ消息的实例

    python 发送和接收ActiveMQ消息的实例

    今天小编就为大家分享一篇python 发送和接收ActiveMQ消息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python web框架 django wsgi原理解析

    python web框架 django wsgi原理解析

    这篇文章主要介绍了python web框架 django wsgi原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2019-08-08
  • Django 联表查询操作方法

    Django 联表查询操作方法

    作为一个django使用的新手,在做练手项目中对联表查询感觉比较生疏,最近两天整理了一些连表查询应用场景和使用方法以及无法使用django中ORM操作的原生查询,对Django 联表查询操作感兴趣的朋友跟随小编一起看看吧
    2023-09-09
  • 详解Python中常用的激活函数(Sigmoid、Tanh、ReLU等)

    详解Python中常用的激活函数(Sigmoid、Tanh、ReLU等)

    激活函数 (Activation functions) 对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用,这篇文章主要介绍了Python中常用的激活函数(Sigmoid、Tanh、ReLU等),需要的朋友可以参考下
    2023-04-04
  • Python 迭代,for...in遍历,迭代原理与应用示例

    Python 迭代,for...in遍历,迭代原理与应用示例

    这篇文章主要介绍了Python 迭代,for...in遍历,迭代原理与应用,结合实例形式分析了Python迭代与遍历的相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-10-10
  • Matplotlib自定义图例(多张图共享一个图例)

    Matplotlib自定义图例(多张图共享一个图例)

    最近再用Matplotlib绘图,需要做两个子图都不需要设置图例,图例单独用一个figure来显示,本文就详细的来介绍一下,感兴趣的可以了解一下
    2023-08-08

最新评论