class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
int sum=0;
for(int i=0;i<n;i++){ //按列计算每列的雨水量,并累加(暴力法)
if(i==0||i==n-1) continue; //不求首尾的雨水
int rHeight = height[i]; // 记录右边柱子的最高高度
int lHeight = height[i]; // 记录左边柱子的最高高度
for (int r = i + 1; r < n; r++) {
rHeight = max(rHeight,height[r]);
}
for (int l = i - 1; l >= 0; l--) {
lHeight = max(lHeight,height[l]);
}
int h = min(lHeight,rHeight)-height[i];
if(h>0)
sum+=h;
}
return sum;
}
};
暴力优化法(双指针)
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
if(n<=2) return 0;
vector<int> lmaxh(n,0);
vector<int> rmaxh(n,0); //把两边的最高的柱子用数组存起来,以空间换时间
lmaxh[0]=height[0];
int sum=0;
for(int i=1;i<n;i++){
lmaxh[i] = max(height[i],lmaxh[i-1]);
}
rmaxh[n-1] = height[n-1];
for(int i=n-2;i>=0;i--){
rmaxh[i] = max(height[i],rmaxh[i+1]);
}
for(int i=0;i<n;i++){
if(i==0||i==n-1) continue;
int h = min(rmaxh[i],lmaxh[i])-height[i];
if(h>0)
sum+=h;
}
return sum;
}
};
单调栈法
class Solution {
public:
int trap(vector<int>& height) {
stack<int> st; //存储下标
int n = height.size();
int sum=0;
for(int i=0;i<n;i++){
if(st.size()&&height[i]<height[st.top()]){
st.push(i);
}
if(st.size()&&height[i]==height[st.top()]){
st.pop();
st.push(i);
}
else{
while(st.size()&&height[i]>height[st.top()]){
int mid = st.top();
st.pop();
if(st.size()){
int h = min(height[st.top()],height[i])-height[mid];
int w = i-st.top()-1;
sum+=h*w;
}
}
st.push(i);
}
}
return sum;
}
};