具体思路就是先计算所有柱子的面积,然后先从左到右然后从右到左把坑填满,计算一个面积
用第二个面积减去第一个面积就是所求,注意各种细节。特殊情况单独讨论。
class Solution { public: int trap(vector<int>& height) { //[0,1,0,2,1,0,1,3,2,1,2,1] // 0 1 2 3 4 5 6 7 8 9 10 if(height.empty()) { return 0; } int index=0; int max = 0; int maxunm=0; int flag=0; //寻找最大值的位置 for (int i = 0; i <height.size(); i++) if (height[i] >= height[max]) { max = i; maxunm=height[max]; } //柱子所占的面积 int pre=0; for(int i=0;i<height.size();i++) { pre=pre+height[i]; } if(maxunm==0) { return 0; } int sum=0; if(height.size()<=2) { return 0; } for(int i=0,j=1;i<height.size()-2;i++,j++) { if(i<max) { if(height[i]>height[j]) { height[j]=height[i]; flag=1; } else{ continue; } } else { if(height[i]<height[j]) { height[i]=height[j]; flag=1; } else{ continue; } } } for(int i=height.size()-2,j=height.size()-1;i>=0;i--,j--) { if(i<max) { if(height[i]>height[j]) { height[j]=height[i]; flag=1; } else{ continue; } } else { if(height[i]<height[j]) { height[i]=height[j]; flag=1; } else{ continue; } } } for(int i=0;i<height.size();i++) { sum=sum+height[i]; } //雨水的面积等于修改过后的面积减去之前柱子的面积 if(flag==1) { return sum-pre; } else { return 0; } } };