单调栈
文章目录
- 一、下一个更大元素II
- 二、接雨水
- 总结
一、下一个更大元素II
1.数组扩展一倍计算
2.模拟遍历两边nums,用i % nums.size()来操作
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
//暴力解法,多层循环
//单调栈
vector<int> result(nums.size(), -1);
if (nums.size() == 0) return result;
stack<int> st;
st.push(0);
for (int i = 1; i < nums.size() * 2; i++) {
// 模拟遍历两边nums,注意一下都是用i % nums.size()来操作
if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());
else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size());
else {
while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
result[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
}
return result;
}
};
二、接雨水
1.单调栈,类似于每日温度多一个凹槽大小判断
2.双指针,一列为计算,计算当前位置左右两边的最高高度,取其中的最小值减去当前位置的高度,即得当前位置能接的雨水。
class Solution {
public:
int trap(vector<int>& height) {
//类似于每日温度但多一个凹槽大小判断
stack<int>st;
int sum = 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.push(i);
else {
while (!st.empty() && height[i] > height[st.top()]) {
int mid = height[st.top()];
st.pop();
if (!st.empty()) {
int h = min(height[i], height[st.top()]) - mid;
int w = i - st.top() - 1;
sum += h * w;
}
}
st.push(i);
}
}
return sum;
}
};
总结
接雨水不算太难,相较于每日温度只增加了一个凹槽判断
学习时间90min。
学习资料:《代码随想录》。