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和在恒定时间内检索最小 ...
随机推荐
- 转:java中volatile关键字的含义
转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- yum安装报错有冲突file /usr/lib64/php/modules/fileinfo.so conflicts between
yum安装报错有冲突file /usr/lib64/php/modules/fileinfo.so conflicts between attempted installs of php-pecl-f ...
- jquery中简易tab切换
<!doctype html> <html> <head> <title>test</title> <meta content=&qu ...
- SQL中char,varchar,nvarchar等的异同
比较这几个数据类型,总是忘记,可能比较细节的原因.先做个记号,回头完善.
- EventHandler委托的使用
今天复习了一下事件和委托,本来看事件来着,看到EventHandler,写了一个小例子,想贴在这里解释一下.为了弄清楚EventHandler, 还是回归到最基本的委托,曾经在园子里看到一位前辈用深入 ...
- Python计算斗牛游戏的概率
Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...
- ASP.NET对HTML元素进行权限控制(三)
上一篇博客中有些没有考虑到的东西这次更改一下代码如下: 界面前台: <%@ Page Language="C#" AutoEventWireup="true&quo ...
- 安装Golang 1.6及开发环境
安装Golang 1.6及开发环境=====================================> 下载软件 * go1.4.2.linux-amd64.tar.gz ...
- 【rest】 深入理解rest
起因是想搞明白 ajax.rest风格和http请求数据会有什么区别 再来回顾一下概念: REST即表述性 状态 传递 满足这些约束条件和原则的应用程序或设计就是RESTful.需要注意的是,REST ...
- ASP.NET MVC 学习第一天
今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择 ...