【Python】LeetCode-155
一、题目
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
Example:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.
二、思路&心得
题意大致就是模拟栈的实现,这题比较出戏的一点就是要求在线性时间内获得栈中的最小值。一共有两个方法,都是比较巧妙的。
方法一:
- 维护两个自己构造的”栈“对象, 在这里为两个数组stack和sm,其中sm的栈顶为当前stack中最小元素;
- 在push时要判断sm是否为空,如果为空或者非空但是栈顶元素大于等于插入值的 需要在sm中插入x;
- 在pop时,s的元素被删除了,那么sm中的也应该被删除;
- 通过这些操作维护sm能很巧妙在O(1)复杂度得到最小值。
方法二:
- 栈中的每个对象为(x, y),其中x为元素值,y为当前对象处于栈顶时,栈中的最小元素;
- 在push的时候,令y为要push的值x和当前栈中最小值两个中的最小值;
- 在top和getMin方法中,直接根据需要返回栈顶的第一个或第二个元素即可。
三、代码
方法一:
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.sm = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
self.stack.append(x)
if not self.sm or self.sm[-1] >= x:
self.sm.append(x)
def pop(self):
"""
:rtype: void
"""
if self.sm[-1] == self.stack[-1]:
self.sm.pop()
self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.sm[-1]
方法二:
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
if not (self.stack):
self.stack.append((x,x))
else:
self.stack.append((x, min(x, self.stack[-1][1])))
def pop(self):
"""
:rtype: void
"""
if self.stack:
self.stack.pop()
else:
return None
def top(self):
"""
:rtype: int
"""
if self.stack:
return self.stack[-1][0]
return None
def getMin(self):
"""
:rtype: int
"""
if self.stack:
return self.stack[-1][1]
return None
【Python】LeetCode-155的更多相关文章
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
- 【python】Leetcode每日一题-删除有序数组中的重复项
[python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...
- 【python】Leetcode每日一题-存在重复元素3
[python]Leetcode每日一题-存在重复元素3 [题目描述] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] ...
- 【python】Leetcode每日一题-扰乱字符串
[python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...
- 【python】Leetcode每日一题-前缀树(Trie)
[python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...
- 【python】Leetcode每日一题-打家劫舍2
[python]Leetcode每日一题-打家劫舍2 [题目描述] 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋 ...
- 【python】Leetcode每日一题-二叉搜索树节点最小距离
[python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...
- 【python】Leetcode每日一题-最大数
[python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...
- 【python】Leetcode每日一题-丑数2
[python]Leetcode每日一题-丑数2 [题目描述] 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例1: 输入:n = ...
- 【python】Leetcode每日一题-丑数
[python]Leetcode每日一题-丑数 [题目描述] 给你一个整数 n ,请你判断 n 是否为 丑数 .如果是,返回 true :否则,返回 false . 丑数 就是只包含质因数 2.3 和 ...
随机推荐
- 基于jquery的插件turn.js学习笔记
基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...
- 使用JQ实现统计剩余字数
JQ实现统计文本框剩余字数 效果图: 代码如下,复制即可使用: <html lang="en"> <head> <meta charset=" ...
- n进制转十进制
#include<cstdio> #include<iostream> using namespace std; ; int main(){ ,len=; char ch[ma ...
- Mschart的Annotations属性使用
近期项目中用到了SPC统计功能,以前是用GDI+绘制的图表,由于坐标计算不准确,显示有偏差,于是重构了代码,将算法与图表做了分离.图表部分如果需要WPF的实现,可以参考以下两个开源项目. https: ...
- inux下进程的最大线程数、进程最大数、进程打开的文件数
inux下进程的最大线程数.进程最大数.进程打开的文件数 2008-12-07 23:48 ========================= 如下转载自这里. linux 系统中单个进程的最大 ...
- RabbitMQ(一):Window安装RabbitMQ
原文:RabbitMQ(一):Window安装RabbitMQ 1.安装ERLANG语言环境 由于RabbitMQ是采用Erlang编写的,因此我们需要先安装该语言库,以便运行代理服务器.从Erlan ...
- JavaScript总结(八)
表单验证 表单验证是JavaScript最常用.最有用的功能之一.在表单内容提交之前进行验证,可以降低服务器处理器的压力,缩短用户等待的时间.表单校验中第一个要考虑的问题是:什么时候捕获表单的录入错误 ...
- 前端- JavaScript - 总结
1.JavaScript的介绍 javaScript是一种web前端的描述语言,也是一种基于对象(object)和事件驱动(Event Driven)的.安全性好的脚本语言. 它运行在客户端从而减轻服 ...
- Java并发工具类(三):控制并发线程数的Semaphore
作用 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 简介 Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数 ...
- HTML中内联元素与块状元素介绍
常用的块级元素: address , center , div , dl ,, form , h1 , h2 , h3 , h4 , h5 , h6 , menu , ol , p , table , ...