Day59 | 503.下一个更大元素II, 42. 接雨水
下一个更大元素II
LeetCode题目:https://leetcode.cn/problems/next-greater-element-ii/
本题与上一个i的区别在于末尾的元素也要进行单调栈的对比操作。因此,可以让循环多向后进行一个长度的循环即可。此外不用对两个数组进行操作,因此使用单个的单调栈循环即可,无需额外的操作。
代码如下:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> result(nums.size(), -1);
stack<int> numStack;
numStack.push(0);
for (int i = 1; i < nums.size() * 2; i++) {
if (nums[numStack.top()] >= nums[i % nums.size()]) {
numStack.push(i % nums.size());
}else {
while (!numStack.empty() && nums[numStack.top()] < nums[i % nums.size()]) {
result[numStack.top()] = nums[i % nums.size()];
numStack.pop();
}
numStack.push(i % nums.size());
}
}
return result;
}
};
接雨水
LeetCode题目:https://leetcode.cn/problems/trapping-rain-water/
此题需要注意的关键点是,接水需要的凹槽需要三个数值才能够构建出来,分别是当前栈顶值,比栈顶值大的新值,以及栈顶到栈尾的递增值。这样才能确定下来可以接雨水的容积。
因此,维护一个单调递增的单调栈,在遇到比栈顶元素大的情况,开始进行容积的计算即可。
代码如下:
class Solution {
public:
int trap(vector<int>& height) {
int result = 0;
stack<int> rainStack;
rainStack.push(0);
for (int i = 1; i < height.size(); i++) {
if (height[i] <= height[rainStack.top()]) {
rainStack.push(i);
} else {
while (!rainStack.empty() && height[i] > height[rainStack.top()]) {
int mid = rainStack.top();
rainStack.pop();
if (rainStack.empty()) {
break;
}
int deepth = min(height[i] - height[mid], height[rainStack.top()] - height[mid]);
result += (abs(i - rainStack.top()) - 1) * deepth;
}
rainStack.push(i);
}
}
return result;
}
};