503.下一个更大的元素||
思路一:单调栈+取模
- 涉及循环数组,直接把遍历的下标翻倍,然后查找和赋值时下标进行取模
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int>st;
int n=nums.size();
vector<int>res(n,-1);
for(int i=0;i<n*2;i++){//遍历下标翻倍
while(!st.empty() && nums[i%n]>nums[st.top()]){//查找时进行取模
cout<<i<<endl;
res[st.top()]=nums[i%n];//赋值时进行取模
st.pop();
}
st.push(i%n);//压入时进行取模(压入的是下标)
}
return res;
}
};
42.接雨水
思路一:单调栈 + 分块计算
class Solution {
public:
int trap(vector<int>& height) {
//思路一:两个单调栈(一前一后)
stack<int>st;
int n=height.size();
int res=0;
st.push(0);
for(int i=1;i<n;i++){
//相同柱子算出的高度为 0
while(!st.empty() && height[i] > height[st.top()]){
int mid=st.top();//底部柱子
st.pop();
if(!st.empty()){//左边还有柱子时
int h=min(height[st.top()],height[i])-height[mid];//雨水的高度
int w=i-st.top()-1;//雨水的宽度
res+=h*w;//加上雨水的面积
}
}
st.push(i);
}
return res;
}
};