题目

带最小值操作的栈

实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。

你实现的栈将支持pushpop 和 min 操作,所有操作要求都在O(1)时间内完成。

解题

可以定义一个数组或者其他的存储最小值,第i个元素,表示栈中前i个元素的最小值。

定义两个ArrayList来存储栈,一个ArrayList存储当前栈中的元素,一个ArrayList存储最小栈,并且其第i个元素表示栈中前i个元素的最小值,这样两个栈的长度是始终一样的

入栈:最小栈需要加入的元素是 当前要入的元素和list中最后一个元素的最小值

出栈:最小栈也要出栈的,不需要进行比较,直接出栈

获取最小值:就是去栈顶元素的,直接取出list 中最后一个元素就好了

取栈顶元素:直接取

  1. public class MinStack {
  2. // 定义两个栈
  3. private ArrayList<Integer> stack;
  4. private ArrayList<Integer> minStack;
  5. public MinStack() {
  6. // do initialize if necessary
  7. stack = new ArrayList<Integer>();
  8. minStack = new ArrayList<Integer>();
  9. }
  10. // 入栈
  11. public void push(int number) {
  12. // write your code here
  13. stack.add(number);
  14. if( minStack.size() ==0){
  15. minStack.add(number);
  16. }else{
  17. int size = minStack.size();
  18. minStack.add(Math.min(number,minStack.get(size-1)));
  19. }
  20. }
  21. // 出栈
  22. public int pop() {
  23. // write your code here
  24. int size = minStack.size();
  25. int pop = stack.get(size - 1);
  26. minStack.remove(size - 1);
  27. stack.remove(size - 1);
  28. return pop;
  29. }
  30. // 最小值
  31. public int min() {
  32. // write your code here
  33. int size = minStack.size();
  34. return minStack.get(size - 1);
  35. }
  36. // 栈顶元素
  37. public int peek(){
  38. int size = stack.size();
  39. return stack.get(size - 1);
  40. }
  41. }

Java Code

上面程序中最小栈元素保存的元素有重读,可以优化下。

九章中看到了另外一种解法,用两个栈了存储两个栈

一种程序如下,最小栈中重复数据减少了。

  1. public class MinStack {
  2. private Stack<Integer> stack;
  3. private Stack<Integer> minStack;
  4. public MinStack() {
  5. // do initialize if necessary
  6. stack = new Stack<Integer>();
  7. minStack = new Stack<Integer>();
  8. }
  9.  
  10. public void push(int number) {
  11. // write your code here
  12. stack.push(number);
  13. if( minStack.isEmpty()){
  14. minStack.push(number);
  15. }else if( number <= minStack.peek()){
  16. minStack.push(number);
  17. }
  18. }
  19.  
  20. public int pop() {
  21. // write your code here
  22. int p = stack.pop();
  23. if( p == minStack.peek())
  24. minStack.pop();
  25. return p;
  26. }
  27.  
  28. public int min() {
  29. // write your code here
  30. return minStack.peek();
  31. }
  32. }

Java Code

九章中给的Python版本的就是利用list实现的

  1. class MinStack(object):
  2.  
  3. def __init__(self):
  4. # do some intialize if necessary
  5. self.stack = []
  6. self.minstack = []
  7.  
  8. def push(self, number):
  9. # write yout code here
  10. self.stack.append(number)
  11. if len(self.minstack) == 0 or number <= self.minstack[-1]:
  12. self.minstack.append(number)
  13.  
  14. def pop(self):
  15. # pop and return the top item in stack
  16. if self.stack[-1] == self.minstack[-1]:
  17. self.minstack.pop()
  18. return self.stack.pop()
  19.  
  20. def min(self):
  21. # return the minimum number in stack
  22. return self.minstack[-1]

Python Code

lintcode 中等题:Min stack 最小栈的更多相关文章

  1. [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 ...

  2. [LintCode] Min Stack 最小栈

    Implement a stack with min() function, which will return the smallest number in the stack. It should ...

  3. [LeetCode] 0155. Min Stack 最小栈 & C++Runtime加速

    题目 Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. ...

  4. [LeetCode] Min Stack 最小栈

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  5. [LeetCode] 155. Min Stack 最小栈

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  6. 第30题:LeetCode155. Min Stack最小栈

    设计一个支持 push,pop,top 操作,并能在O(1)时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素 ...

  7. 155 Min Stack 最小栈

    设计一个支持 push,pop,top 操作,并能在常量时间内检索最小元素的栈.    push(x) -- 将元素x推入栈中.    pop() -- 删除栈顶的元素.    top() -- 获取 ...

  8. 【LeetCode】155. Min Stack 最小栈 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 栈同时保存当前值和最小值 辅助栈 同步栈 不同步栈 日期 题目地 ...

  9. LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

随机推荐

  1. 转:java中volatile关键字的含义

    转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...

  2. 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 ...

  3. jquery中简易tab切换

    <!doctype html> <html> <head> <title>test</title> <meta content=&qu ...

  4. SQL中char,varchar,nvarchar等的异同

    比较这几个数据类型,总是忘记,可能比较细节的原因.先做个记号,回头完善.

  5. EventHandler委托的使用

    今天复习了一下事件和委托,本来看事件来着,看到EventHandler,写了一个小例子,想贴在这里解释一下.为了弄清楚EventHandler, 还是回归到最基本的委托,曾经在园子里看到一位前辈用深入 ...

  6. Python计算斗牛游戏的概率

    Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...

  7. ASP.NET对HTML元素进行权限控制(三)

    上一篇博客中有些没有考虑到的东西这次更改一下代码如下: 界面前台: <%@ Page Language="C#" AutoEventWireup="true&quo ...

  8. 安装Golang 1.6及开发环境

    安装Golang 1.6及开发环境=====================================> 下载软件    * go1.4.2.linux-amd64.tar.gz     ...

  9. 【rest】 深入理解rest

    起因是想搞明白 ajax.rest风格和http请求数据会有什么区别 再来回顾一下概念: REST即表述性 状态 传递 满足这些约束条件和原则的应用程序或设计就是RESTful.需要注意的是,REST ...

  10. ASP.NET MVC 学习第一天

    今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择 ...