不管是单调栈还是单调队列,都有金字塔形状和倒金字塔形状,按照具体题意分析;
单调栈
问题类型:
在数组里面找到下一个比当前元素大的元素数值或下标、接雨水等等;
- 栈里面可以存下标或数值,建议存下标;
- 单调栈分为金字塔形状和倒金字塔形状;
- 按遍历方向不同,有不同的实现方式;
样式代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| vector<int> nextGreaterElementCore(vector<int>& nums) { int n = nums.size(); stack<int> st; vector<int> ans(n, -1); for (int i = n - 1; i >= 0; --i) { while (!st.empty() && st.top() <= nums[i]) { st.pop(); } ans[i] = st.empty() ? -1 : st.top(); st.push(nums[i]); } return ans; }
vector<int> dailyTemperatures(vector<int>& T) { stack<int> st; vector<int> result(T.size(), 0); for (int i = 0; i < T.size(); i++) { while (!st.empty() && T[i] > T[st.top()]) { result[st.top()] = i - st.top(); st.pop(); } st.push(i);
} return result; }
for (int i = 2 * n - 1; i >= 0; --i) { int curIndex = i % n; ... }
|
单调队列
样式代码
- 从front到back单调递减;
- que.pop(滑动窗口中移除元素的数值)
- que.push(滑动窗口添加元素的数值)
- que.front()就返回我们要的最大值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class MyQueue { public: deque<int> que; void pop(int value) { if (!que.empty() && value == que.front()) { que.pop_front(); } } void push(int value) { while (!que.empty() && value > que.back()) { que.pop_back(); } que.push_back(value); } int front() { return que.front(); } };
|
【参考资料】代码随想录、力扣