left[0]= height[0], right[len-1]= height[len-1];for(int i =1;i < len;++i)
left[i]=max(left[i-1], height[i]);for(int i = len -2; i >=0;--i)
right[i]=max(right[i+1], height[i]);
这样遍历两遍之后,left[i]中存的值就是在所有0<= j <= i 中最大的height[j],即i左边的最大高度,right[i] 中存的值就是i <= j <len 中最大的height[j],即i右边最大的高度,然后对于每个矩形,求出左边和右边最大高度的较小者,减去矩形本身的高度便可的能存水的最大高度,乘以宽度1,便是这个矩形存水的量。
代码实现
classSolution{public:inttrap(vector<int>& height){if(height.empty())return0;int len = height.size();
vector <int>left(len),right(len);
left[0]= height[0], right[len-1]= height[len-1];for(int i =1;i < len;++i)
left[i]=max(left[i-1], height[i]);for(int i = len -2; i >=0;--i)
right[i]=max(right[i+1], height[i]);auto res{0};for(int i =0; i < len;++i)
res +=min(left[i], right[i])- height[i];return res;}};