设计一个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.设计的栈类型可以使用现成的栈结构. ...
随机推荐
- 安装Nginx的Dockerfile实例
#################################################Dockerfile to build Nginx Installed Containers##Bas ...
- Linux LVM硬盘管理及LVM扩容
LVM磁盘管理 一.LVM简介... 1 二. LVM基本术语... 2 三. 安装LVM... 3 四. 创建和管理LVM... 4 2. 创建PV.. 6 3. 创建VG.. 7 4. 创建LV. ...
- 另类分析SIGSEGV信号
关于SIGSEGV信号的含义就不解释了.网络上有很多解释. 今天记录一下,自己遇到的一个问题,想了好几天都没想出来的.今天终于想到原因了. 过程描述: 有个类 CBase,里面放了一个成员变量 DAT ...
- 跳过IE10安装VS2013
@ECHO OFF :IE10HACK REG ADD "HKLM\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer" /v Ver ...
- C++引用详解
引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. i ...
- oracle数据库备份和还原
ip导出方式:exp demo/demo@127.0.0.1:1521/orcl file=f:\f.dmp full=y 备份:exp demo/demo@orcl file=f:\f.dmp f ...
- BarTender是怎么做出雪花状文字
一些小伙伴在做标签时,发现有的人做的标签上的文字颜色不是纯色的,问我是怎么做的.这种雪花状文字要设置出来其实很简单,只要用到字体颜色填充工具就可以了.下面,小编就来给大家简单介绍一下BarTender ...
- Disque
Disque是一个内存储存的分布式任务队列实现, 它由 Redis 的作者 Salvatore Sanfilippo (@antirez)开发, 目前正处于预览版(alpha)阶段. 本文档将对 Di ...
- install Hadoop
Installing Java Hadoop runs on both Unix and Windows operating systems, and requires Java to beinsta ...
- Javascript定义类(class)的三种方法
将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...