文章目录
- 1. 题目
- 2. 解题
- 2.1 双栈解法
- 2.2 list+map
1. 题目
设计一个最大栈,支持 push、pop、top、peekMax 和 popMax 操作。
push(x) -- 将元素 x 压入栈中。
pop() -- 移除栈顶元素并返回这个值。
top() -- 返回栈顶元素。
peekMax() -- 返回栈中最大元素。
popMax() -- 返回栈中最大的元素,并将其删除。如果有多个最大元素,只要删除最靠近栈顶的那个。样例 1:
MaxStack stack = new MaxStack();
stack.push(5);
stack.push(1);
stack.push(5);
stack.top(); -> 5
stack.popMax(); -> 5
stack.top(); -> 1
stack.peekMax(); -> 5
stack.pop(); -> 1
stack.top(); -> 5注释:
-1e7 <= x <= 1e7
操作次数不会超过 10000。
当栈为空的时候不会出现后四个操作。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/max-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:LeetCode 155. 最小栈
2.1 双栈解法
- 同时插入数值,和最大值
- 当要删除最大的值的时候,要将不是最大值的数,先存入临时栈,后序再挪回来,最坏时间复杂度O(n)
class MaxStack {int maxelem = INT_MIN;stack<int> s;stack<int> temp;int v, m;
public:/** initialize your data structure here. */MaxStack() {}void push(int x) {maxelem = max(maxelem, x);s.push(x);s.push(maxelem);}int pop() {s.pop();v = s.top();s.pop();maxelem = s.empty() ? INT_MIN : s.top();return v;}int top() {m = s.top();s.pop();v = s.top();s.push(m);return v;}int peekMax() {return s.top();}int popMax() {int ans = s.top();maxelem = s.top();bool flag = true;while(flag){s.pop();if(s.top() != maxelem)temp.push(s.top());elseflag = false;s.pop();}maxelem = s.empty() ? INT_MIN : s.top();while(!temp.empty()){v = temp.top();temp.pop();s.push(v);maxelem = max(maxelem, v);s.push(maxelem);}return ans;}
};
140 ms 32.2 MB
2.2 list+map
- list 当做栈来使用
- map的key为数值,value挂着数值下,对应的list迭代器
- 时间复杂度O(log n)
class MaxStack {list<int> l;map<int, vector<list<int>::iterator>> m;
public:/** initialize your data structure here. */MaxStack() {}void push(int x) {l.push_front(x);m[x].push_back(l.begin());}int pop() {int v = l.front();m[v].pop_back();if(m[v].empty())m.erase(v);l.pop_front();return v;}int top() {return l.front();}int peekMax() {return m.rbegin()->first;}int popMax() {int v = m.rbegin()->first;auto it = m[v].back();m[v].pop_back();if(m[v].empty())m.erase(v);l.erase(it);return v;}
};
240 ms 35.2 MB
长按或扫码关注我的公众号,一起加油、一起学习进步!