lintcode 中等题:Min stack 最小栈
题目
带最小值操作的栈
实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。
你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。
解题
可以定义一个数组或者其他的存储最小值,第i个元素,表示栈中前i个元素的最小值。
定义两个ArrayList来存储栈,一个ArrayList存储当前栈中的元素,一个ArrayList存储最小栈,并且其第i个元素表示栈中前i个元素的最小值,这样两个栈的长度是始终一样的
入栈:最小栈需要加入的元素是 当前要入的元素和list中最后一个元素的最小值
出栈:最小栈也要出栈的,不需要进行比较,直接出栈
获取最小值:就是去栈顶元素的,直接取出list 中最后一个元素就好了
取栈顶元素:直接取
public class MinStack {
// 定义两个栈
private ArrayList<Integer> stack;
private ArrayList<Integer> minStack;
public MinStack() {
// do initialize if necessary
stack = new ArrayList<Integer>();
minStack = new ArrayList<Integer>();
}
// 入栈
public void push(int number) {
// write your code here
stack.add(number);
if( minStack.size() ==0){
minStack.add(number);
}else{
int size = minStack.size();
minStack.add(Math.min(number,minStack.get(size-1)));
}
}
// 出栈
public int pop() {
// write your code here
int size = minStack.size();
int pop = stack.get(size - 1);
minStack.remove(size - 1);
stack.remove(size - 1);
return pop;
}
// 最小值
public int min() {
// write your code here
int size = minStack.size();
return minStack.get(size - 1);
}
// 栈顶元素
public int peek(){
int size = stack.size();
return stack.get(size - 1);
}
}
Java Code
上面程序中最小栈元素保存的元素有重读,可以优化下。
九章中看到了另外一种解法,用两个栈了存储两个栈
一种程序如下,最小栈中重复数据减少了。
public class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack() {
// do initialize if necessary
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public void push(int number) {
// write your code here
stack.push(number);
if( minStack.isEmpty()){
minStack.push(number);
}else if( number <= minStack.peek()){
minStack.push(number);
}
}
public int pop() {
// write your code here
int p = stack.pop();
if( p == minStack.peek())
minStack.pop();
return p;
}
public int min() {
// write your code here
return minStack.peek();
}
}
Java Code
九章中给的Python版本的就是利用list实现的
class MinStack(object):
def __init__(self):
# do some intialize if necessary
self.stack = []
self.minstack = []
def push(self, number):
# write yout code here
self.stack.append(number)
if len(self.minstack) == 0 or number <= self.minstack[-1]:
self.minstack.append(number)
def pop(self):
# pop and return the top item in stack
if self.stack[-1] == self.minstack[-1]:
self.minstack.pop()
return self.stack.pop()
def min(self):
# return the minimum number in stack
return self.minstack[-1]
Python Code
lintcode 中等题:Min stack 最小栈的更多相关文章
- [CareerCup] 3.2 Min Stack 最小栈
3.2 How would you design a stack which, in addition to push and pop, also has a function min which r ...
- [LintCode] Min Stack 最小栈
Implement a stack with min() function, which will return the smallest number in the stack. It should ...
- [LeetCode] 0155. Min Stack 最小栈 & C++Runtime加速
题目 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. ...
- [LeetCode] Min Stack 最小栈
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- [LeetCode] 155. Min Stack 最小栈
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- 第30题:LeetCode155. Min Stack最小栈
设计一个支持 push,pop,top 操作,并能在O(1)时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素 ...
- 155 Min Stack 最小栈
设计一个支持 push,pop,top 操作,并能在常量时间内检索最小元素的栈. push(x) -- 将元素x推入栈中. pop() -- 删除栈顶的元素. top() -- 获取 ...
- 【LeetCode】155. Min Stack 最小栈 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 栈同时保存当前值和最小值 辅助栈 同步栈 不同步栈 日期 题目地 ...
- LeetCode算法题-Min Stack(Java实现)
这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...
随机推荐
- css style与class之间的区别
问题描述: 网页点击[导出]按钮后,将页面table内容另存成excel文件,却发现无法保存表格样式 分析过程: 1.table表格用class,而不是style.导出时并没有导出class定义 ...
- jQuery EasyUI 数据网格 - 启用行内编辑(转自http://www.runoob.com/jeasyui/jeasyui-datagrid-datagrid12.html)
可编辑的功能是最近添加到数据网格(datagrid)的.它可以使用户添加一个新行到数据网格(datagrid).用户也可以更新一个或多个行.本教程向您展示如何创建一个数据网格(datagrid)和内联 ...
- silverlight 画图InkPresenter
<UserControl x:Class="SilverlightTest.PolygonTest" xmlns="http://schemas.microsoft ...
- smarty框架块函数
块函数的形式是这样的:{func} .. {/func}.换句话说,它们被封闭在一个模板区域内,然后对该区域的内容进行操作.默认地,你的函数实现会被Smarty调用两次:一次是在开始标签,另一次是在闭 ...
- LAMP开发之环境搭建(2014.12.7在ubuntu下)
Ubuntu下搭建LAMP环境 前言:学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我搭建的是LAMP环境,即Linux.Apache ...
- kendo ui template的用法
kendo ui template的用法: Kendo UI 框架提供了一个易用,高性能的JavaScript模板引擎.通过模板可以创建一个HTML片段然后可以和JavaScript数据合并成最终的H ...
- RUP(Rational Unified Process)
RUP Rational Unified Process 目前阶段在学习UML,怎么会写RUP呢?学习UML是为了更好的把系统搭建好,RUP也是一样,为系统服务! 软件危机 美国国家总审计局,在198 ...
- cocos2dx中常见的类及类继承关系
场景:CCScene,继承自CCNode,几乎完全等于CCNode类 CCNode继承自CCObject,CCObject是真正意义上的父类,CCObject又继承自CCCopying类,CCCopy ...
- VBS基础篇 - wscript 对象
一.wscript对象 描述:提供对 Windows 脚本宿主对象模型根对象的访问.详述:WScript 对象是 Windows 脚本宿主对象模型层次结构的根对象.它可在任何脚本文件中使用,不需要特定 ...
- Jquery-------获取网页参数
看如下代码: function getURLParameter(name) { return decodeURI( (RegExp(name + '=' + '(.+?)(&|$)').exe ...