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 相关文章推荐
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
Jun 13 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
对python周期性定时器的示例详解
Feb 19 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
python 函数中的参数类型
Feb 11 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
python批量更改目录名/文件名的方法
Apr 18 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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的开发框架的现状和展望
2007/03/16 PHP
php PDO中文乱码解决办法
2009/07/20 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
js 分栏效果实现代码
2009/08/29 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
Python的pycurl包用法简介
2015/11/13 Python
Python入门_条件控制(详解)
2017/05/16 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python实现月食效果实例代码
2019/06/18 Python
Django后台admin的使用详解
2019/07/08 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
Python实时监控网站浏览记录实现过程详解
2020/07/14 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
毕业生文员求职信
2013/11/03 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
植树节活动总结
2014/04/30 职场文书
劳资员岗位职责
2015/02/13 职场文书
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript