59-02 队列的最大值
题目
定义一个队列并实现函数max得到队列里的最大值。要求max,pushBack,popFront的时间复杂度都是o(1)。
C++ 题解
同上一题相同,我们要寻找队列的最大值,相当于将滑动窗口设置为整个队列。
这里需要使用两个队列,一个队列用来保存入队的数据,一个队列用来保存队列的当前最大值。
同时需要注意出队操作,数据队列出队的同时需要判断其索引是否和当前最大值队列首部索引相同,如果相同则同时也将最大值队列头部出队。
template<typename T> class QueueWithMax
{
public:
QueueWithMax() : currentIndex(0)
{
}
// 入队的原理与上一题类似,比当前值小的原队列数据先要弹出
void push_back(T number)
{
while (!maximums.empty() && number >= maximums.back().number)
maximums.pop_back();
InternalData internalData = { number, currentIndex };
data.push_back(internalData);
maximums.push_back(internalData);
++currentIndex;
}
// 数据队列出队时需要注意,如果出队的正好是当前的最大值,那么最大值队列中也需要将这个值出队
void pop_front()
{
if (maximums.empty())
throw new exception("queue is empty");
if (maximums.front().index == data.front().index)
maximums.pop_front();
data.pop_front();
}
// 最大值存在队首
T max() const
{
if (maximums.empty())
throw new exception("queue is empty");
return maximums.front().number;
}
private:
struct InternalData
{
T number;
int index;
};
deque<InternalData> data; // 数据队列
deque<InternalData> maximums; // 存放最大值的队列
int currentIndex;
};