设计一个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.设计的栈类型可以使用现成的栈结构. ...
随机推荐
- HDU 4857 逃生 (反向拓扑排序 & 容器实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- Linux破解root密码
实验环境 虚拟机软件:VMware Workstation 操作系统:Read Hat Enteprise 6.3 1.破解r ...
- Monkey工具使用详解
上节中介绍了Monkey工具使用环境的搭建,传送门..本节我将详细介绍Monkey工具的使用. 一.Monkey测试简介 Monkey测试是Android平台自动化的一种手段,通过Monkey程序模拟 ...
- 2016HUAS_ACM暑假集训4F - 数论
这个题目,如果没找到方向,确实有点一头雾水.但是如果你找对方向了,AC是分分钟的事.答案就是看n和m是否有除1之外的公约数. 简单证明:设n和m最大公约数不是1,假设为p.n和m总可以化为一个数乘以k ...
- 2016HUAS_ACM暑假集训3F - Jungle Roads
这个题目属于最小生成树问题,可以用Prim,也可以用Kruskal(还没试).题意简单直接,给你一个图,求出它最小生成树的权值. 题目最有趣的地方就是图的顶点是字母,稍微处理一下就好了. Sample ...
- Quartz conTrigger 定时器表达式大全
CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , ...
- [课程设计]Scrum 1.5 多鱼点餐系统开发进度
1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统WEB 5.Sprint 1时间:11.14-11.23 重案 ...
- 用程序获取 Internet 时间 无通用性程序后的暂用办法
并不是完全失败,但没找到一个通用的办法,这个通用指的不能通用所有的时间服务器,而不是说操作系统. 网上的方案很多,有用Socket类.或TcpClient类(C#).或UdpClient类,端口有使用 ...
- HotSpotOverview.pdf
从oracle官网下载的这个HotSpot虚拟机的概况文档,现在翻一下锁的部分: Java 锁 *每一个java对象都是一个潜在的monitor(监视器) >synchronized 关键字 * ...
- SQL 用户定义表类型,在存储过程里使用表类型,表参数作参数
.定义表类型SUTDENTTYPE,包含三个字段,分别对应学生表的NAME,SEX和PHONE.之所以如此创建,我是准备在插入新学生数据的存储过程中,以它为参数. GO CREATE TYPE S ...