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精粹之布局技巧
1.若有疑问立即检测 在出错时若能对原始代码做简单检测可以省去很多头痛问题.W3C对于XHTML与CSS都有检测工具可用,请见http://validator.w3.org 请注意,在文件开头的错误, ...
- callback调用测试
<html> <head> <script> var context="全局"; var testObj={ context:"初始& ...
- [WinForm]TextBox只能输入数字或者正浮点型数字
关键代码: /// <summary> /// 只能输入数字[KeyPress事件] /// </summary> /// <param name="textB ...
- silverlight 用户浏览器未安装SL插件问题
1.在Silverlight启动页面 <%@ Page Language="C#" AutoEventWireup="true" %> <!D ...
- ubuntu 停在开机界面
今天有解决了一个问题.我在win7虚拟机上装的64位的Ubuntu 12.04.忘了怎么个情况了,反正就是系统进不去了,停在了开机界面,5个点的那个. 解决方法如下: 开机的时候按住shift键,进入 ...
- Delphi XE5教程4:程序和单元概述
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误!也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者可 ...
- Json(2)-DataContractJsonSerializer
public static void DataContractSerializeDemo() { User user = new User { UserID = 1 ...
- Selenium 入门
我本身也是一个初学者,就顺手记录一下自己的成长记录,共勉 1, 登录selenium官方网站,download 相关的插件. http://docs.seleniumhq.org/ 我用的是eclip ...
- Python中Cookie的处理(一)Cookie库
Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理.要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下内容的HTTP报头: Set-Cookie:session= ...
- 轻量级远程调用框架-Hessian学习笔记-Demo实现
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...