定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
剑指 Offer 30. 包含min函数的栈https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/
法1:
- 同时定义一个栈和一个优先级队列(最小堆)
- 数据插入栈的同时,也插入优先级队列
- 这样每次取 min 值时 从优先级队列中取,时间复杂度就能达到 O(1)
缺点:性能差,空间开销也大
法2:
- 同时定义两个栈,一个栈存放原数据,一个栈作为辅助栈、存放当前 min 值
- push 和 pop 操作同时对两个栈进行
- 每次取 min 值时 直接从辅助栈中取,时间复杂度为 O(1)
优点:相比于用优先级队列的方法,减少了每次调整节点找最小值的时间、减少了树状结构的额外空间开销,性能更好
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
m_data.push(x);
if (m_min.empty())
{
m_min.push(x);
}
else
{
int min = m_min.top();
m_min.push(x < min ? x : min);
}
}
void pop() {
// base case
if (m_data.empty())
{
return;
}
m_data.pop();
m_min.pop();
}
int top() {
// base case
if (m_data.empty())
{
return -1;
}
return m_data.top();
}
int min() {
// base case
if (m_data.empty())
{
return -1;
}
return m_min.top();
}
private:
stack<int> m_data; // 记录原始数据
stack<int> m_min; // 辅助栈,记录最小值
};