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 相关文章推荐
python3简单实现微信爬虫
Apr 09 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python配置mysql的教程(推荐)
Oct 13 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
Python中函数的基本定义与调用及内置函数详解
May 13 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
PHP文件操作简单介绍及函数汇总
2020/12/11 PHP
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
vue.js从安装到搭建过程详解
2017/03/17 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
使用watch在微信小程序中实现全局状态共享
2019/06/03 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
python实现windows下文件备份脚本
2018/05/27 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
python 制作网站小说下载器
2021/02/20 Python
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
班组长岗位职责范本
2014/01/05 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
高一学年自我鉴定范文(3篇)
2014/09/26 职场文书
2014年政风行风评议工作总结
2014/10/21 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js