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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 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 结果集的分页实现代码
2009/03/10 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP项目多语言配置平台实现过程解析
2020/05/18 PHP
动态刷新 dorado树的js代码
2009/06/12 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
jQuery实现购物车数字加减效果
2015/03/14 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python 加密的实例详解
2017/10/09 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
python编写微信公众号首图思路详解
2019/12/13 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
教师实习期自我鉴定
2013/10/06 职场文书
实习生个人总结范文
2015/02/28 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
党支部审查意见
2015/06/02 职场文书