O(1)时间复杂度求栈的最小元素
来源:互联网 发布:阿里云网站建设教程 编辑:程序博客网 时间:2024/05/20 11:19
题目:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
思路:
栈数据结构的特点是先进后出,push和pop操作都是对栈顶元素进行的操作,所以都是常数时间复杂度,即O(1),但是由于栈中数据是无序的,所以仅仅通过栈是无法得到最小元素的,又由于每次出栈和进栈都可能会使栈的最小元素发生变化,所以考虑用一个辅助的栈空间来存储每次进栈和出栈之后的最小元素,为了节省空间,辅助栈中不存储最小元素的值,而存储最小元素的地址或者在数据栈中的索引。
代码:
#include <vector>
using namespace std;
template<typename T> class CStack
{
public:
CStack();
~CStack();
void pop(T& value);
void push(const T& value);
const T& getMin() const;
private:
vector<T> _data;
vector<size_t> _minIndex;
}
template<typename T> CStack<T>::CStack()
{
}
template<typename T> CStack<T>::~CStack()
{
}
template<typename T> void CStack<T>::pop(T& value)
{
if(_data.empty())
{
return;
}
else
{
value = _data.back();
_data.pop_back();
_minIndex.pop_back();
}
}
template<typename T> void CStack<T>::push(T& value)
{
_data.push_back(value);
if(_minIndex.empty())
{
_minIndex.push_back(0);
}
else if(value < _data[_minIndex.back()])
{
_minIndex.push_back(_data.size()-1);
}
else
{
_minIndex.push_back(_minIndex.back());
}
}
template<typename T> const T&CStack<T>::getMin() const
{
assert( !_data.empty() );
assert( !_minIndex.empty() );
return _data[_minIndex.back()];
}
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
思路:
栈数据结构的特点是先进后出,push和pop操作都是对栈顶元素进行的操作,所以都是常数时间复杂度,即O(1),但是由于栈中数据是无序的,所以仅仅通过栈是无法得到最小元素的,又由于每次出栈和进栈都可能会使栈的最小元素发生变化,所以考虑用一个辅助的栈空间来存储每次进栈和出栈之后的最小元素,为了节省空间,辅助栈中不存储最小元素的值,而存储最小元素的地址或者在数据栈中的索引。
代码:
#include <vector>
using namespace std;
template<typename T> class CStack
{
public:
CStack();
~CStack();
void pop(T& value);
void push(const T& value);
const T& getMin() const;
private:
vector<T> _data;
vector<size_t> _minIndex;
}
template<typename T> CStack<T>::CStack()
{
}
template<typename T> CStack<T>::~CStack()
{
}
template<typename T> void CStack<T>::pop(T& value)
{
if(_data.empty())
{
return;
}
else
{
value = _data.back();
_data.pop_back();
_minIndex.pop_back();
}
}
template<typename T> void CStack<T>::push(T& value)
{
_data.push_back(value);
if(_minIndex.empty())
{
_minIndex.push_back(0);
}
else if(value < _data[_minIndex.back()])
{
_minIndex.push_back(_data.size()-1);
}
else
{
_minIndex.push_back(_minIndex.back());
}
}
template<typename T> const T&CStack<T>::getMin() const
{
assert( !_data.empty() );
assert( !_minIndex.empty() );
return _data[_minIndex.back()];
}
- O(1)时间复杂度求栈的最小元素
- O(1)时间复杂度求栈的最小元素
- 如何在O(1)的时间复杂度求栈中的最小数据元素:
- 在O(1)时间复杂度中,求栈中的最小元素
- 如何用O(1)的时间复杂度求栈中最小元素
- 如何用O(1)的时间复杂度求栈中最小元素
- 用时间复杂度O(1)的算法求栈中的最小元素
- 带有取最小元素的栈,要求压栈、出栈、取最小元素时间复杂度O(1)
- 【C++】返回栈中最小的元素,要求时间复杂度为O(1)
- 使用栈在O(1)的时间复杂度求最大值
- Min栈——用O(1)时间复杂度返回当前栈中最小元素
- O(1)时间复杂度实现入栈、出栈、获得栈中最小元素、获得栈中最大元素
- O(1)时间求出栈中最小的元素
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
- 定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。
- 定义栈的数据结构, 要求添加一个 min 函数, 能够得到栈的最小元素。 要求函数 min、 push 以及 pop 的时间复杂度都是 O(1)
- 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。时间复杂度都是O(1)
- 单点登录(七)cas支持客户端登录——服务器端
- CMS_Magnolia guide
- xcode编译项目Permission denied错误
- git branch
- Jdk1.5新特性(一)
- O(1)时间复杂度求栈的最小元素
- coco2d-x开发之文字的设置
- 第16期状元简讯:天猫双十一将于10月14日开始预热
- CAS
- 继承机制
- Matrix类
- java下载网页中的内容
- mysql使用索引
- 我的WCF开发框架简化版及基于NET.TCP传输方式的实现