python实现时间o(1)的最小栈的实例代码

yipeiwu_com6年前Python基础

这是毕业校招二面时遇到的手写编程题,当时刚刚开始学习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设计】。

相关文章

在Django的模板中使用认证数据的方法

当前登入的用户以及他(她)的权限可以通过 RequestContext 在模板的context中使用。 注意 从技术上来说,只有当你使用了 RequestContext这些变量才可用。...

Python面向对象程序设计之类的定义与继承简单示例

本文实例讲述了Python面向对象程序设计之类的定义与继承。分享给大家供大家参考,具体如下: 定义类: class A: def __init__(self, name):...

python如何读写json数据

本文实例为大家分享了python读写json数据的具体代码,供大家参考,具体内容如下 案例:   在web应用中常常用到json数据进行传输数据,本质上是字典类型数据转换成字符串,通过字...

Python读取Excel表格,并同时画折线图和柱状图的方法

Python读取Excel表格,并同时画折线图和柱状图的方法

今日给大家分享一个Python读取Excel表格,同时采用表格中的数值画图柱状图和折线图,这里只需要几行代码便可以实。 首先我们需要安装一个Excel操作的库xlrd,这个很简单,在安装...

Python语言编写电脑时间自动同步小工具

Python语言编写电脑时间自动同步小工具

话不多说,小工具需求如下: 功能需求 -- 电脑开机后自动执行时间同步 非功能需求 -- 安装执行简单,无需安装额外环境 一、代码实现 基于以上需求,思路如下:访问网络获取北京时间,然后...