单调栈
文章目录
- 一、下一个更大元素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。
学习资料:《代码随想录》。