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代理抓取并验证使用多线程实现
May 03 Python
Python处理json字符串转化为字典的简单实现
Jul 07 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
Python之pymysql的使用小结
Jul 01 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
Python箱型图处理离群点的例子
Dec 09 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
php 随机生成10位字符代码
2009/03/26 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
php实现中文转数字
2016/02/18 PHP
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
jQuery实现评论模块
2020/08/19 jQuery
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
python编码最佳实践之总结
2016/02/14 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
python中os.remove()用法及注意事项
2021/01/31 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
机修工工作职责
2014/02/21 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
简单租房协议书范本
2014/08/20 职场文书
2016十一国庆节感言
2015/12/09 职场文书
小学科学课教学反思
2016/02/23 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS