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 05 Python
Python 基础教程之包和类的用法
Feb 23 Python
Python实现求解一元二次方程的方法示例
Jun 20 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
python读取.mat文件的数据及实例代码
Jul 12 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
Python获取指定网段正在使用的IP
Dec 14 Python
MoviePy常用剪辑类及Python视频剪辑自动化
Dec 18 Python
Pandas的数据过滤实现
Jan 15 Python
解决hive中导入text文件遇到的坑
Apr 07 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获取当前url路径的函数以及服务器变量
2013/06/29 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
python flask搭建web应用教程
2019/11/19 Python
Python内置异常类型全面汇总
2020/05/28 Python
学习python需要有编程基础吗
2020/06/02 Python
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
财务部岗位职责
2013/11/19 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
社区先进事迹材料
2014/05/19 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL
python缺失值填充方法示例代码
2022/12/24 Python