LC 503.下一个更大元素II
题目链接:LC 503.下一个更大元素II
思路:与上一章节的题目不同之处为循环数组,因此遍历两边数组即可。
代码:
class Solution {
public:
//重要的是终止条件,可以直接进行两次遍历
vector<int> nextGreaterElements(vector<int>& nums) {
int count = 0;//统计处理过的数的数目
vector<int> result(nums.size(), -1);
stack<int> st;
st.push(0);//将下标保存下来。为什么都要保存下标,因为要通过下标,对对应位置的数组进行赋值
int i = 1;//遍历的下标
for(int i=1; i<nums.size()*2; i++){
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;
}
};
LC 42. 接雨水
题目链接:LC 42. 接雨水
思路:找到某元素右边第一个更大元素使用的单调递增栈,为什么叫递增栈,是因为栈取元素时只能从栈顶到栈底,然后栈顶到栈底元素值越来越大的就是递增栈。
在用单调栈模拟接雨水的过程中模拟的是横向来统计雨水量。
主要思路为:
1.找到每个柱子(栈顶的柱子)的左右两边距离最近的比它高的柱子,首先右边比它高的柱子就是遍历的柱子,左边比它高的柱子为栈顶下面的柱子;
2.统计两个柱子之间的距离以及两边柱子与栈顶柱子的高度差,来计算雨水量。
代码:
class Solution {
public:
//本质就是找到下一个更大的数,但是在找到下一个更大数的同时要统计目前能接的雨水数目
int trap(vector<int>& height) {
if(height.size()<=2)return 0;//特殊情况直接返回
int result = 0;
stack<int> st;//创建栈
st.push(0);//将第一个下标入栈
for(int i=1; i<height.size(); i++){
while(!st.empty() && height[i]>height[st.top()]){
int cur = st.top();//首先保存栈顶元素下标
st.pop();//然后弹出栈顶元素,找到栈顶元素下面的元素
if(st.empty())break;
result = result + (min(height[i], height[st.top()])-height[cur]) * (i-st.top()-1);
}
st.push(i);
}
return result;
}
};