503. 下一个更大元素
就是遍历两遍
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. 接雨水
双指针做法是竖向求每一格的雨水
class Solution {
public:
int trap(vector<int>& height) {
int res=0;
vector<int> maxLeft(height.size(),0);
vector<int> maxRight(height.size(),0);
for(int i=1;i<height.size();i++){
maxLeft[i]=max(height[i-1],maxLeft[i-1]);
}
for(int i=height.size()-2;i>=0;i--){
maxRight[i]=max(height[i+1],maxRight[i+1]);
}
for(int i=1;i<height.size()-1;i++){
if(min(maxLeft[i],maxRight[i])-height[i]>0)
res+=min(maxLeft[i],maxRight[i])-height[i];
}
return res;
}
};
其实与其说是双指针不如说是 双数组法
单调栈是横向求雨水
class Solution {
public:
int trap(vector<int>& height) {
int res=0;
stack<int> st;
for(int i=0;i<height.size();i++){
while(!st.empty()&&height[i]>height[st.top()]){
int mid=st.top();
st.pop();
if(!st.empty())
res+=(min(height[st.top()],height[i])-height[mid])*(i-st.top()-1);
}
st.push(i);
}
return res;
}
};
要注意这句if(!st.empty())