最值队列
实现一个最值队列,要求取最大值、最小值的时间复杂度为O(1)。以前实现最值栈比较多,又因为一个队列可以用两个栈实现,所以最传统的做法是用最值栈实现最值队列。这里用deque实现最值队列,简单高效。
template<typename T>
class queue_ext : public queue<T>
{
public:
void push(const typename queue<T>::value_type &t)
{
// Update max deque.
while (!m_dqMax.empty() && t > m_dqMax.back())
{
m_dqMax.pop_back();
}
m_dqMax.push_back(t);
// Update min deque.
while (!m_dqMin.empty() && t < m_dqMin.back())
{
m_dqMin.pop_back();
}
m_dqMin.push_back(t);
queue<T>::push(t);
}
void pop()
{
if (!m_dqMax.empty() && queue<T>::front() == m_dqMax.front())
{
m_dqMax.pop_front();
}
if (!m_dqMin.empty() && queue<T>::front() == m_dqMin.front())
{
m_dqMin.pop_front();
}
queue<T>::pop();
}
typename queue<T>::const_reference max_val() const
{
return m_dqMax.front();
}
typename queue<T>::const_reference min_val() const
{
return m_dqMin.front();
}
private:
deque<T> m_dqMin;
deque<T> m_dqMax;
};
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步