Day59
503.下一个更大元素II
题目链接:503.下一个更大元素II
本题所求的为环形。数组遍历时,可将索引由i改为i % nums.size()来进行环形遍历。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> res(nums.size(), -1);
stack<int> st;
for (int i = 0; i < 2 * nums.size()/*环形遍历的终止条件*/; ++i) {
while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
res[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
return res;
}
};
42. 接雨水
题目链接:42. 接雨水
单调栈可以取到大于当前元素的左右元素。右侧元素是与栈顶元素比较获得。左侧元素是由于单调栈的单调性,在栈中保存。从栈顶中弹出的元素为当前元素
通过单调栈来求解面积,是将面积按照横向求解。
class Solution {
public:
int trap(vector<int>& height) {
stack<int> st;
int sum = 0;
for (int i = 0; i < height.size(); ++i) {
while (!st.empty() && height[i] > height[st.top()]) {
int cur = st.top();
st.pop();
//先取出当前元素cur,弹出,才能获得大于当前元素的左侧元素。
if (!st.empty()/*确保有左侧元素*/) {
//求面积
int Height = min(height[st.top()/*左侧元素*/], height[i/*右侧元素*/]) - height[cur];
int Width = i - st.top() - 1;
sum += Height * Width;
}
}
st.push(i);
}
return sum;
}
};
文章讲述了使用栈解决两个LeetCode问题的算法,一个是503题《下一个更大元素II》,通过环形遍历和栈找到每个元素的下一个更大值;另一个是42题《接雨水》,利用单调栈计算能接住的雨水量,重点在于栈的使用和计算面积的方法。
676

被折叠的 条评论
为什么被折叠?



