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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
python 实现字符串下标的输出功能
Feb 13 Python
python网络编程之五子棋游戏
May 14 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 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获取程序执行的时间
2013/06/09 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
vue实现动态按钮功能
2019/05/13 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
Python函数的周期性执行实现方法
2016/08/13 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
python实现简易内存监控
2018/06/21 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
python字典的常用方法总结
2019/07/31 Python
Python实现序列化及csv文件读取
2020/01/19 Python
生物技术专业研究生自荐信
2013/09/22 职场文书
艺术爱好者的自我评价分享
2013/10/08 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
受伤赔偿协议书
2014/09/24 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书