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标准库之随机数 (math包、random包)介绍
Nov 25 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
Python实现八大排序算法
Aug 13 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
用pandas按列合并两个文件的实例
Apr 12 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
使用Python更换外网IP的方法
Jul 09 Python
python cumsum函数的具体使用
Jul 29 Python
python isinstance函数用法详解
Feb 13 Python
Python阶乘求和的代码详解
Feb 14 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
python tqdm用法及实例详解
Jun 16 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
php数据访问之查询关键字
2016/05/09 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
js获取URL的参数的方法(getQueryString)示例
2013/09/29 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
js闭包实例汇总
2014/11/09 Javascript
javascript基本类型详解
2014/11/28 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
实习老师个人总结的自我评价
2013/09/28 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
装修协议书范本
2014/04/21 职场文书
文明社区申报材料
2014/08/21 职场文书
2014年学生会工作总结
2014/11/07 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
2015年女工委工作总结
2015/07/27 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
python中%格式表达式实例用法
2021/06/18 Python
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python