面试题三:设计包括 min 函数的栈。
3.设计包括 min 函数的栈。
定义栈的数据结构,要求加入一个 min 函数。可以得到栈的最小元素。
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
思路分析:
a.要想一个在栈中找出栈的最小值,且时间复杂度为1,我们可能回忆到每次向栈插入push()一个值都对其进行排序操作,将最小值放在栈顶,可是我们非常快会发现这样的方式破坏了栈的结构,不再满足栈的先进先出的特点了(FIFO),此法不行
b.通过一个成员函数来保存最新值,但当最小元素弹出栈pop()时,我们无法得到次小元素,所以此法也不行。
c.大家可能立刻想到用数组了。通过数组来保存对栈进行插入或删除后栈中的最小值,但这有一个弊端,我们不知道要给数组申请大多的地址空间,由于我们事先无法确定会插入多少个数到栈中,此法不优
d.我们能够使用一个辅助栈来存放最小值
操作:
| option | dataStack栈 | minStack栈 |
|---|---|---|
| push(3) | 3 | 3 |
| push(5) | 3,5 | 3,3 |
| push(2) | 3,5,2 | 3,3,2 |
| push(6) | 3,5,2,6 | 3,3,2,2 |
| pop() | 3,5,2 | 3,3,2 |
| pop() | 3,5 | 3,3 |
minStack就是我们的辅助栈,dataStack就是基本的数据栈
如今我知道要得到栈中的最小值,就是辅助栈的栈顶元素故调用minStack.peek()。
Java代码例如以下:
package com.WuKung.blog;
import java.util.Stack; /**
* @author WuKung
* @csdnURL http://blog.csdn.net/wu_kung/
* @createdDate 2014-4-7 下午11:18:47
*/
public class StackWithMin<E extends Comparable<E>> extends Stack<E>{ Stack<E> data;
Stack<E> min; public StackWithMin(Stack<E> data,Stack<E> min){
this.data = data;
this.min = min;
} @Override
public E push(E item) {
// TODO Auto-generated method stub if(data.size()==0||item.compareTo(min.peek())<0){
min.push(item);
}else{
min.push(min.peek());
}
data.push(item);
return super.push(item);
} @Override
public synchronized E pop() {
// TODO Auto-generated method stub
if(!min.isEmpty()&&!data.isEmpty()){
min.pop();
data.pop();
}
return super.pop();
} public E min(){
return min.peek();
}
}
測试类:
package com.WuKung.blog;
import java.util.Stack; /**
* @author WuKung
* @csdnURL http://blog.csdn.net/wu_kung/
* @createdDate 2014-4-8 上午12:17:18
*/
public class StackT { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Stack<Integer> data = new Stack<Integer>();
Stack<Integer> min = new Stack<Integer>();
StackWithMin<Integer> test = new StackWithMin<Integer>(data, min);
test.push(new Integer(3));
test.push(new Integer(5));
test.push(new Integer(2));
test.push(new Integer(6));
test.pop();
test.pop();
System.out.println(test.min());
}
}
測试结果:
面试题三:设计包括 min 函数的栈。的更多相关文章
- 【剑指Offer学习】【面试题21:包括min 函数的栈】
题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数.在该栈中.调用min.push 及pop的时间复杂度都是0(1) 解题思路: 把每次的最小元素(之前的最小元素和新压入战 ...
- 【编程题目】设计包含 min 函数的栈
2.设计包含 min 函数的栈(栈)定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素.要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 我的思路: 用一个额外的 ...
- 【面试题021】包含min函数的栈
[面试题021]包含min函数的栈 MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...
- 面试经典-设计包含min函数的栈
问题:设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素. 要求函数min.push以及pop的时间复杂度都是O(1). 解答:push 和pop的时间复杂度 ...
- 剑指offer——面试题30:包含min函数的栈
#include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...
- 面试题21:包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:google的一道面试题.我看到这道题目时,第一反应就是每次p ...
- 剑指Offer面试题:19.包含Min函数的栈
一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...
- 面试题之堆栈队列系列一:设计包含min函数的栈
编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...
- 设计包含min()函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是去年google的一道面试题. 我看到这道题目时,第一反应 ...
随机推荐
- fullpage在vue单页面当中使用会出现的问题以及解决办法
在 vue 单页面当中发现fullpage会报错,报错信息大概意思为,fullpage不允许初始化多次. 解决办法,在使用fullpage的组件跳转路由进入销毁组件之前的生命周期的时候对fullpag ...
- UVa1362 Exploring Pyramids
区间dp,枚举走完第一个子树之后回到根节点的位置. /*by SilverN*/ #include<algorithm> #include<iostream> #include ...
- 52深入理解C指针之---不透明指针
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教.一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:s ...
- linux sleep函数
应用程序: #include usleep(n) //n微秒 Sleep(n)//n毫秒 sleep(n)//n秒 驱动程序: #include mdelay(n) //milliseconds 其实 ...
- 对于Redux的理解
在移动端项目,经常会在不同view中进行传递数据,事件.当事件比较少时,我们可以通过常规的事件流方法,注册,发布事件 进行响应等等.但是项目中一个事件多处响应时候,就会使程序变得相当复杂.在现在的Vu ...
- hdu 1796(容斥原理+状态压缩)
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 数据库SQL Server 2014 设置自动备份(维护计划和作业)
前言 1.SQL Server数据库自动备份可以有两种操作 第一种是在SQL控制台下的服务器名称展开,展开“管理”--选择“维护计划”,右键“新建维护计划”即可. ...
- python安装numpy和matplotlib
1.从该链接下载对应的whl文件 2.按照下面的方式从whl文件安装即可 windows7 python2.7 1.用管理员方式打开cmd 2.首先通过pip命令安装wheel 如果提示’pip’不是 ...
- Java并发容器,底层原理深入分析
ConcurrentHashMap ConcurrentHashMap底层具体实现 JDK 1.7底层实现 将数据分为一段一段的存储,然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据时, ...
- Cef应用程序结构
Application Structure 应用程序结构 Every CEF3 application has the same general structure. Provide an entry ...