python实现时间o(1)的最小栈的实例代码
作者:熔遁丶螺旋手里剑 发布时间:2021-08-01 15:24:42
标签:python,时间o(1),最小栈
这是毕业校招二面时遇到的手写编程题,当时刚刚开始学习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
来源:https://www.cnblogs.com/baiyb/p/8443337.html


猜你喜欢
- 这篇文章主要介绍了python 采用paramiko 远程执行命令及报错解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 给定一个可迭代sequence,对其中的值进行出现次数统计:方法1:def get_counts(sequence): counts = {
- 本文实例讲述了Python Web框架之Django框架Form组件用法。分享给大家供大家参考,具体如下:Form简介在HTTP中,表单(f
- 1、一个或多个文件夹组成一个模块,而一个模块组合构成了一个包发布在公共目录里。2、包必须有__init__文件,否则就是一个文件夹。实例im
- MySQL有多种存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、
- Windows环境下python的安装与使用一、python如何运行程序首先说一下python解释器,它是一种让其他程序运行起来的程序。当你
- 每次安装总是有些不同,这次用这种方式尝试一下,也记录一下。1、首先需要去下载rpm包:镜像地址:http://mysql.mirrors.p
- 穿过云朵升一级是要花6个金币的,有的时候金币真的很重要前言嗨喽,大家好呀!这里是魔王~一天晚上,天空中掉下一颗神奇的豌豆种子,正好落在了梦之
- 首先获取ip:<% userip=Request.ServerVariables(&qu
- 1、唠唠叨叨最近项目中需要Python的打包,看到网上也没有很详细的资料,于是做了一些示例程序。小小的研究了一下,Python如何在Wind
- 描述sin()返回的x弧度的正弦值。语法以下是sin()方法的语法:importmath math.sin(x)注意:sin()是不能直接访
- 杨紫和肖战的《余生请多指教》于3月15日起腾讯视频全网独播,湖南卫视金鹰独播剧场晚8:20播放。对于杨紫的纯剧粉(战长沙入的坑图片),想要用
- 1.什么是SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL
- SQL Server 2000安装问题集锦1、先把SQL Server卸载(卸载不掉也没有关系,继续下面的操作)2、把Microsoft S
- 平衡二叉树:在上一节二叉树的基础上我们实现,如何将生成平衡的二叉树所谓平衡二叉树:我自己定义就是:任何一个节点的左高度和右高度的差的绝对值都
- 一、文件内容的分发 应用场景:分批读取共有358086行内容的txt文件,每取1000条输出到一个文件当中# coding=utf-8# 分
- 参数数量及其作用该函数共有十一个参数,常用的有:名称 name变量规格 shape变量类型 dtype变量初始化方式 initializer
- python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提
- tips:如果根目录下有favicon.ico,可省去<link rel="shortcut icon" ...&
- 有时候在读取数据库之后,针对同一结果集,在同一个页面上输出的时候可能会碰到多次输出,也就是多次执行mysql_fetch_array(),在