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处理圆角图片、圆形图片的例子
Apr 25 Python
用python 批量更改图像尺寸到统一大小的方法
Mar 31 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
python matplotlib库直方图绘制详解
Aug 10 Python
Python 利用高德地图api实现经纬度与地址的批量转换
Aug 14 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
PHP下对数组进行排序的函数
2010/08/08 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
Vue如何实现监听组件原生事件
2020/07/03 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
windows下python安装pip图文教程
2018/05/25 Python
Python类的继承用法示例
2019/01/31 Python
Python3 max()函数基础用法
2019/02/19 Python
django-allauth入门学习和使用详解
2019/07/03 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
理想演讲稿范文
2014/05/21 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
模范班主任事迹材料
2014/12/17 职场文书
技术支持岗位职责
2015/02/13 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript