单调栈解决问题类型:
适用于一维数组。
单调栈 -----> 解决寻找任意元素距左边或右边第一个比自己的大或小的元素位置问题。
空间换时间,时间复杂度(O(n))
单调栈里存放:元素下标
顺序描述:从栈头到栈底,寻递减序列,需满足三角形;寻递增序列需满足倒三角形。
单调栈主要有三个判断条件。
- 当前遍历的元素 T [ i ] 小于 栈顶元素 T [ st.top( ) ]的情况
- 当前遍历的元素 T [ i ] 等于 栈顶元素 T [ st.top( ) ]的情况
- 当前遍历的元素 T [ i ] 大于 栈顶元素 T [ st.top( ) ]的情况
单调栈例题:
输入:温度数组[1,2,3,6,4,2,1,7];输出:后几天温度比当前温度高的天数数组[1,1,1,4,3,2,1,0] ;
分析:
- T [ i ] 小于 T [ st.top( ) ] 直接 push ( );
- T [ i ] 等于 T [ st.top( ) ] 直接 push ( );
- T [ i ] 大于 T [ st.top( ) ] 需判停条件:1)非空 2)T [ i ] > T [ st.top ( ) ];
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
// 递增栈
stack<int> st;
vector<int> result(T.size(), 0);
st.push(0);
for (int i = 1; i < T.size(); i++) {
if (T[i] < T[st.top()]) { // 情况一
st.push(i);
} else if (T[i] == T[st.top()]) { // 情况二
st.push(i);
} else {
while (!st.empty() && T[i] > T[st.top()]) { // 情况三
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
}
return result;
}
};
接雨水
解法有三
盛最多水的容器 接雨水【基础算法精讲】_哔哩哔哩_bilibilis
双向双指针解法:前后缀最大值数组 + 高度数组(巧妙解决)
单调栈解法:
单调栈,经典来袭!LeetCode:42.接雨水_哔哩哔哩_bilibili
分析:单调栈获得左右大于该高度的第一个元素的下标, min(左右高度)*下标差, 为该高度可接雨水量。