单调栈 part 02
单调栈
● 503.下一个更大元素II
● 42. 接雨水
● 84.柱状图中最大的矩形
503.下一个更大元素II
法1:单调栈
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> ans(nums.size(),-1);
stack<int> st;
int size =nums.size();
for (int i = 0; i < nums.size() * 2; ++i) {
while (!st.empty() && nums[i % size] > nums[st.top()]){
ans[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % size);
}
return ans;
}
42. 接雨水
42. 接雨水
法1:单调栈
int largestRectangleArea(vector<int>& height) {
height.insert(height.begin(),0);
stack<int> st;
int ans = 0;
st.push(0);
for (int i = 1; i < height.size(); ++i) {
if (height[i] > height[st.top()]){
st.push(i);
} else if (height[i] == height[st.top()]){
st.pop();
st.push(i);
} else{
while (!st.empty() && height[i] < height[st.top()]){
int mid =st.top();
st.pop();
if (!st.empty()){
int h = height[mid];//min(height[i], height[st.top()]) -
int w = i - st.top() - 1;
ans = max(ans, h * w);
}
}
st.push(i);
}
}
return ans;
}
84.柱状图中最大的矩形
84.柱状图中最大的矩形
法1:单调栈
int largestRectangleArea(vector<int>& height) {
height.insert(height.begin(),0);
stack<int> st;
int ans = 0;
st.push(0);
for (int i = 1; i < height.size(); ++i) {
if (height[i] > height[st.top()]){
st.push(i);
} else if (height[i] == height[st.top()]){
st.pop();
st.push(i);
} else{
while (!st.empty() && height[i] < height[st.top()]){
int mid =st.top();
st.pop();
if (!st.empty()){
int h = height[mid];//min(height[i], height[st.top()]) -
int w = i - st.top() - 1;
ans = max(ans, h * w);
}
}
st.push(i);
}
}
return ans;
}