思路:

1.首先将栈的基本结构写出

#初始化栈的写法
def __init__(self):
self.stack = [] #栈的压入 (加self是实例化,如果前面加入静态装饰器啥的,就不需要加入self)
def push(self,node):
self.stack.append(node) #栈的弹出
def pop(self):
#pop需要return
if self.stack:
return self.stack.pop()
return None #栈顶元素 def top(self):
return self.stack[-1]

2. 需要用空间换时间,来构造一个辅助栈(与原栈长度相同)存放小的元素;当然我程序中采用的是第二种思路,辅助栈的长度不一定等于原栈,这个时候需要在弹出是判断是否弹出

每次压入栈的一个元素,就记录一个当前的最小元素

每次弹出栈的一个元素,就连带着辅助栈的元素一起弹出

 实现以上思路:

# -*- coding:utf-8 -*-
class Solution:
  #为了时间复杂度为O(n)的指标,需要牺牲空间复杂度,我们建立一个栈(和原来栈长度一致)来做辅助存储最小元素
def __init__(self):
self.stack = []
self.minStack = [] def push(self, node):
# write code here
self.stack.append(node)
if self.minStack:
if self.minStack[-1] > node:
self.minStack.append(node)
else:
self.minStack.append(self.minStack[-1])
else:
self.minStack.append(node) def pop(self):
# write code here
if self.stack:
self.minStack.pop()
return self.stack.pop()
return None def top(self):
# write code here
if self.stack:
return self.stack[-1]
return None def min(self):
# write code here
if self.minStack:
return self.minStack[-1]
return None

  我们还可以对上面的思路变形,也就是构造辅助栈时,辅助栈只存储当前最小元素,长度<=原来栈的长度,也就是上面的4只存储一遍

# -*- coding:utf-8 -*-
class Solution:
# 首先将栈的基本功能实现
def __init__(self):
self.stackA = []
self.minStack = []
def push(self, node):
# write code here
self.stackA.append(node)
if self.minStack:
if self.minStack[-1] > node:
self.minStack.append(node)
else:
self.minStack.append(node)
def pop(self):
# write code here
if self.stackA:
if self.stackA[-1] == self.minStack[-1]:
self.minStack.pop()
return self.stackA.pop()
return None
def top(self):
# write code here
if self.stackA:
return self.stackA[-1]
return None
def min(self):
# write code here
if self.minStack == []:
return None
return self.minStack[-1]

  

面试题30:包含min函数的栈的更多相关文章

  1. 剑指offer面试题30.包含min函数的栈

    一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...

  2. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...

  3. 剑指Offer - 九度1522 - 包含min函数的栈

    剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...

  4. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  5. 剑指offer二十之包含min函数的栈

    一.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 二.思路 用一个栈dataStack保存数据,用另外一个栈minStack保存依次入栈最小的数.每次元素存入minSt ...

  6. 【剑指Offer】20、包含min函数的栈

      题目描述:   定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)).   解题思路:   使用两个stack,一个为数据栈,另一个为辅助栈.数据栈 ...

  7. 《剑指offer》面试题30. 包含min函数的栈

    问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).   示例: MinStack minSt ...

  8. 剑指 Offer 30. 包含min函数的栈 + 双栈实现求解栈中的最小值

    剑指 Offer 30. 包含min函数的栈 Offer_30 题目描述: 题解分析: 题目其实考察的是栈的知识,本题的目的是使用两个栈来求解最小值. 第二个栈主要用来维护第一个栈中的最小值,所以它里 ...

  9. 剑指 Offer 30. 包含min函数的栈

    剑指 Offer 30. 包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例 ...

  10. 力扣 - 剑指 Offer 30. 包含min函数的栈

    题目 剑指 Offer 30. 包含min函数的栈 思路1 使用一个辅助栈min_stack,用来维护栈的最小的元素 每次添加元素入栈时候,data_stack和min_stack都要同时维护 dat ...

随机推荐

  1. 【Vue 2.X】基于input[type='number']封装parseFloat、parseInt-自定义指令系列(一)

    一.parseFloat 效果:限制负值输入,且输入值不为空时自动保留两位小数,等同于js的parseFloat(value).toFixed(2) 使用:与v-model配合使用,v-parseFl ...

  2. 缓存模块redis

    1.安装 安装 下载 :wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压:tar xzf redis-3.2.8.tar.gz ...

  3. Windows程序设计--(三)窗口与消息

    3.1 窗口的创建 3.1.1 系统结构概述 所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息.这种位于Windows程序中的函数称为「窗口 ...

  4. 【JAVA】毕向东Java基础视频教程-笔记

    传智播客-毕向东Java基础视频教程 <2013年-33days>版-学习代码记录 链接: GitHub库:JavaBXD33 目录 01-Java基础知识 02-Java对象细节 03- ...

  5. tensorflow的阶、形状、数据类型

    张量的阶.形状.数据类型 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 ...

  6. Linux学习笔记2-CentOS7安装tomcat8

    1.下载tomcat:apache-tomcat-8.5.16.tar.gz 下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat ...

  7. kali Linux 入门(一)

    一.描述 1.基于Debian Linux 发行版 2013年3月13日 2.包含约600个安全工具 3.定制 安全稳定的内核 4.前身是BackTrack(2013年停止维护) 5.官方机构:Off ...

  8. Algorithms4th 1.1.25 欧几里得算法——数学归纳法证明

    欧几里得算法的自然语言描述 计算两个非负整数p和q的最大公约数: 若q是0,则最大公约数为p.否则将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数. 数学归纳法证明 基础步骤: 若q = ...

  9. HTML基础 结构,标题<h1>和段落<p> 写一个三毛语录

    先看代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  10. 记一个日志冲突——管中窥豹[java混乱的日志体系]

    D:\Java\jdk1.8.0_211\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Communit ...