设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)
面试的时候,面试官让设计一个栈,要求有Push、Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成。
当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅、思路不够开阔,特地写个总结来学习一下。
其实思路挺简单,只是没有接触过的话,一时反应不过来。我们将栈中的每个元素都增加两个索引号,一个最大元素索引一个最小元素索引,这样我们可以根据栈只能访问栈顶元素的特性,在每个元素入栈时记下当前栈里面的最大最小元素的索引号,这样我们通过对栈顶元素的访问,就可以随时拿到当前栈中最大最小元素了,这是典型的空间换时间思想。
示例代码如下:
#include<iostream> using namespace std; typedef int ElemType; class MinMaxStack
{
public:
MinMaxStack() : m_size() { }
~MinMaxStack() { } bool Push(const ElemType& e)
{
if (m_size >= STACK_MAXIMUM) {
return false;
} // 如果是第一个元素,则将最大最小元素索引都设置为0
if (m_size == ) {
m_stack[m_size].elem = e;
m_stack[m_size].maxIndex = ;
m_stack[m_size].minIndex = ;
}
else {
int minIndex = m_stack[m_size - ].minIndex;
int maxIndex = m_stack[m_size - ].maxIndex;
m_stack[m_size].elem = e; // 设置插入元素的最大元素索引:
// 若插入元素比当前最大元素大,则将其最大元素索引设置为它自己的索引
// 否则,设置为前一个元素的最大元素索引
if (e > m_stack[maxIndex].elem) {
m_stack[m_size].maxIndex = m_size;
}
else {
m_stack[m_size].maxIndex = maxIndex;
} // 设置插入元素的最小元素索引
// 若插入元素比当前最小元素小,则将其最小元素索引设置为它自己的索引
// 否则,设置为前一个元素的最小元素索引
if (e < m_stack[minIndex].elem) {
m_stack[m_size].minIndex = m_size;
}
else {
m_stack[m_size].minIndex = minIndex;
}
}
m_size++; return true;
} bool Pop(ElemType& e)
{
if (m_size == ) {
return false;
} m_size--;
e = m_stack[m_size].elem; return true;
} int Size()
{
return m_size;
} const ElemType& Min()
{
if (m_size == ) {
return INIT_VALUE;
} int minIndex = m_stack[m_size - ].minIndex;
return m_stack[minIndex].elem;
} const ElemType& Max()
{
if (m_size == ) {
return INIT_VALUE;
} int maxIndex = m_stack[m_size - ].maxIndex;
return m_stack[maxIndex].elem;
} private:
struct StackNode
{
StackNode(const ElemType& e = INIT_VALUE, int min = , int max = )
: elem(e), minIndex(min), maxIndex(max)
{
} ElemType elem;
int minIndex;
int maxIndex;
}; static const int STACK_MAXIMUM = ;
static const ElemType INIT_VALUE; StackNode m_stack[STACK_MAXIMUM];
int m_size;
}; const ElemType MinMaxStack::INIT_VALUE = -; // 测试代码
int main()
{
MinMaxStack stack;
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Push();
stack.Push(); cout << "size = " << stack.Size() << endl;
cout << "min = " << stack.Min() << endl;
cout << "max = " << stack.Max() << endl;
cout << "------------------------------------" << endl; ElemType e;
stack.Pop(e);
cout << "size = " << stack.Size() << endl;
cout << "min = " << stack.Min() << endl;
cout << "max = " << stack.Max() << endl;
cout << "pop = " << e << endl;
cout << "------------------------------------" << endl; stack.Pop(e);
cout << "size = " << stack.Size() << endl;
cout << "min = " << stack.Min() << endl;
cout << "max = " << stack.Max() << endl;
cout << "pop = " << e << endl;
cout << "------------------------------------" << endl; stack.Pop(e);
cout << "size = " << stack.Size() << endl;
cout << "min = " << stack.Min() << endl;
cout << "max = " << stack.Max() << endl;
cout << "pop = " << e << endl;
cout << "------------------------------------" << endl; stack.Pop(e);
cout << "size = " << stack.Size() << endl;
cout << "min = " << stack.Min() << endl;
cout << "max = " << stack.Max() << endl;
cout << "pop = " << e << endl;
cout << "------------------------------------" << endl; stack.Pop(e);
cout << "size = " << stack.Size() << endl;
cout << "min = " << stack.Min() << endl;
cout << "max = " << stack.Max() << endl;
cout << "pop = " << e << endl;
cout << "------------------------------------" << endl; return ;
}
设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)的更多相关文章
- 数据结构---设计一个栈,push, pop, min 时间复杂度都是 O(1)
普通的栈,push, pop 操作的复杂度是 O(1), 但是如果要找出其中的最小值,则需要 O(N)的时间. 题目要求 min 复杂度也是 O(1), 做法便是 空间换时间,每一步栈的最小值都用一个 ...
- 设计一个带有getmin功能的栈,保证时间复杂度在O(1)
2017-06-22 20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...
- 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
刚入手了一本<程序员代码面试指南>,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象. 题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈, ...
- 设计一个有getMin功能的栈
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“设计一个有getMin功能的栈”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明 ...
- 设计一个有getMin功能的栈(2)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 设计一个有getMin功能的栈(1)
题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...
- 常见面试算法题JS实现-设计一个有getMin功能的栈
前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ...
- 栈和队列问题:设计一个有 getMin 功能的栈
[知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ...
- 左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈
[题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. ...
随机推荐
- Python 文件操作函数
这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文 ...
- Tomcat口令猜解工具【Python脚本】
Tomcat 服务器网页部署,登录需用户名/密码,编写了一个简单的Python脚本来测试一些简单的弱口令. 测试环境:Tomcat版本 7.0 登录界面采用basic认证,Base 64加密一下,模拟 ...
- UNITY5以后怎么改GUI文字
提要:以前是UNITY4,后来用了新的UI,于是GUIText这种东西就没有了,研究了很久.... ---------------------------- 这里我想拖个GUI文字框显示FPS,于是代 ...
- xloader
[1],先看一下整个系统的结构(软件是灵魂,硬件是驱体,再强大的灵魂力若没有躯体终将是游魂野鬼,再强壮的驱体若没有灵魂终将是植物人) 结构 作用 备注 硬件 一切软件的载体 xloader 引导u ...
- 关于位图读取函数int Load_Bitmap_File的lseek问题。
事情是这样的,本人在编译3D游戏编程大师技巧中的程序是遇到了一个关于位图读取函数int Load_Bitmap_File的lseek问题. 我使用以下位图读取函数读取位图事报错如下: int Load ...
- zabbix问题处理
工作的时候回遇到各种各样的问题. 今天遇到一个关于zabbix的问题. "Zabbix agent on host.name is unreachable for 5 minutes&quo ...
- 如何对web.config进行加密和解密
http://blog.csdn.net/jf_jifei/article/details/6527390 在WEB网站开发过程中,如果我们将数据库连接字符串封装到.DLL文件中,将会给数据库和程序的 ...
- Maven新建webapp项目index.jsp报错
最近用eclipse新建了一个maven项目,结果刚新建完成index.jsp页面就报错了,先把错误信息贴出来看看 后来就找资料,结果发现两种解决办法,希望可以帮助用得上的人! 第一种:直接在pom. ...
- 安装oracle数据库,登录 时无法连接目标机
oracle11g 在dos命令里输入输入sqlplus 输入如用户名: 输入口令: 还是无法连接 解决办法: 输入sqlplus/nolog按enter键再输入conn/as sysdba就好了
- mongodb 对内嵌文档(数组) group分页查询,并设置查询条件
文档示例Account的其中一条记录: // collection: Account { "_id" : ObjectId("5843e38e535f3708f759b2 ...