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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
python爬虫的工作原理
Mar 05 Python
python3爬取淘宝信息代码分析
Feb 10 Python
Python中文编码知识点
Feb 18 Python
python3.7 sys模块的具体使用
Jul 22 Python
python tornado修改log输出方式
Nov 18 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
详解Python中的format格式化函数的使用方法
Nov 20 Python
python数据预处理 :数据抽样解析
Feb 24 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
Jun 15 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
进行数据处理的6个 Python 代码块分享
Apr 06 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.ini中文版
2006/10/09 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
python的中异常处理机制
2018/08/30 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
tensorflow 查看梯度方式
2020/02/04 Python
python 字符串格式化的示例
2020/09/21 Python
如何用python写个模板引擎
2021/01/14 Python
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
最新大学生自我评价
2013/09/24 职场文书
医学生求职自荐信
2013/10/25 职场文书
社团活动策划书范文
2014/01/09 职场文书
关于人生的感言
2014/01/17 职场文书
丑小鸭教学反思
2014/02/03 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
道歉情书大全
2015/05/12 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技