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使用Berkeley DB数据库实例
Sep 26 Python
Python基于pygame实现的弹力球效果(附源码)
Nov 11 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python subprocess模块详细解读
Jan 29 Python
Python通用函数实现数组计算的方法
Jun 13 Python
python应用文件读取与登录注册功能
Sep 23 Python
为什么说Python可以实现所有的算法
Oct 04 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 Python
Python如何使用input函数获取输入
Aug 06 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/05 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
Javascript获取当前时间函数和时间操作小结
2014/10/01 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python中tell()方法的使用详解
2015/05/24 Python
python安装pil库方法及代码
2019/06/25 Python
使用Python在Windows下获取USB PID&VID的方法
2019/07/02 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
汉森批发:Hansen Wholesale
2018/05/24 全球购物
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
自荐信格式
2013/12/01 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
爱心捐款活动总结
2015/05/09 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server
vue封装数字翻牌器
2022/04/20 Vue.js
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL