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字典的方法详解
Aug 31 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
详解Django-restframework 之频率源码分析
Feb 27 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
Pyqt5实现英文学习词典
Jun 24 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
Python传递参数的多种方式(小结)
Sep 18 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 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代码(抓取网页中的邮箱地址)
2012/07/17 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
js输出列表实现代码
2010/09/12 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
python通过shutil实现快速文件复制的方法
2015/03/14 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
python3爬虫怎样构建请求header
2018/12/23 Python
详解Python3 基本数据类型
2019/04/19 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
深入浅析Python代码规范性检测
2020/07/31 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
Hotels.com越南:酒店预订
2019/10/29 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
小学生家长评语集锦
2014/01/30 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
依法行政工作汇报
2014/10/28 职场文书
《认识年月日》教学反思
2016/02/19 职场文书