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实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python中字符串格式化str.format的详细介绍
Feb 17 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
python查看矩阵的行列号以及维数方式
May 22 Python
详解Python设计模式之策略模式
Jun 15 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
python实现马丁策略的实例详解
Jan 15 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 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/04 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
Vue实现商品分类菜单数量提示功能
2019/07/26 Javascript
Python中Random和Math模块学习笔记
2015/05/18 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
python实现小球弹跳效果
2019/05/10 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python实现UDP协议下的文件传输
2020/03/20 Python
python进度条显示之tqmd模块
2020/08/22 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
N.Peal官网:来自伦敦的高档羊绒品牌
2018/10/29 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
公证书标准格式
2014/04/10 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书