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


Posted in Python onJuly 23, 2018

这是毕业校招二面时遇到的手写编程题,当时刚刚开始学习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

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

Python 相关文章推荐
Python使用xlrd读取Excel格式文件的方法
Mar 10 Python
python登录并爬取淘宝信息代码示例
Dec 09 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
Python3之手动创建迭代器的实例代码
May 22 Python
django-allauth入门学习和使用详解
Jul 03 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
Python字符串的修改方法实例
Dec 19 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
python 怎样进行内存管理
Nov 10 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
Dec 07 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 #Python
Flask框架Flask-Login用法分析
Jul 23 #Python
Django中的文件的上传的几种方式
Jul 23 #Python
flask中的wtforms使用方法
Jul 21 #Python
详解flask表单提交的两种方式
Jul 21 #Python
python实现周期方波信号频谱图
Jul 21 #Python
Flask-Mail用法实例分析
Jul 21 #Python
You might like
php empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
python 默认参数问题的陷阱
2016/02/29 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
python多进程控制学习小结
2018/10/31 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
英国领先的瓷砖专家:Walls and Floors
2018/04/27 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
应届毕业生个人自荐信范文
2013/11/30 职场文书
眼镜促销方案
2014/03/15 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
应届毕业生自荐信
2014/05/28 职场文书
先进事迹演讲稿
2014/09/01 职场文书
刑事代理授权委托书
2014/09/17 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
博士给导师的自荐信
2015/03/06 职场文书
python某漫画app逆向
2021/03/31 Python
golang 如何通过反射创建新对象
2021/04/28 Golang
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android