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中将字典转换成其json字符串
Jul 16 Python
Python中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
python清除函数占用的内存方法
Jun 25 Python
Python构建图像分类识别器的方法
Jan 12 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
Pandas 缺失数据处理的实现
Nov 04 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
python文件读取失败怎么处理
Jun 23 Python
python实现按日期归档文件
Jan 30 Python
python实现杨辉三角的几种方法代码实例
Mar 02 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微信公众号开发之简答题
2018/10/20 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
jquery 插件开发备注
2010/08/27 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
jquery.pager.js分页实现详解
2019/07/29 jQuery
JS实现音乐钢琴特效
2020/01/06 Javascript
Python验证企业工商注册码
2015/10/25 Python
python字符串,数值计算
2016/10/05 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
Python新手学习raise用法
2020/06/03 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
水务局局长岗位职责
2013/11/28 职场文书
秋季婚礼证婚词
2014/01/11 职场文书
家长学校工作方案
2014/05/07 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
交通安全主题班会
2015/08/12 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
个人销售励志奋斗口号
2019/12/05 职场文书
python - timeit 时间模块
2021/04/06 Python
CSS中Single Div 绘图技巧的实现
2021/06/18 HTML / CSS
spring boot中nativeQuery的用法
2021/07/26 Java/Android
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript