42. 接雨水
1.动态规划
-
如本题标记为困难,但如果掌握了动态规划的思想,本题十分简单。
-
首先明确一个观点:如何装水。装水需要当前这一格的左、右都比当前高,才能装水,并且存在一个”木桶效应“,能装的水量,取决于左右两侧较矮的一侧。
-
假设我们当前站在i格子的位置:
i左边的所有柱子最高为A,i右边的所有柱子最高为B。并且i格子当下的柱子高为C;
那么必须C<min(A,B)才有可能装水,装水量为min(A,B)-C;
-
至此每个位置能装水的状态就分析完全了,只需要正反两次遍历求出我们需要的左边最高柱子、右边最高柱子两个信息即可。
class Solution { public: int trap(vector<int>& height) { int n=height.size(); int left[n],right[n],result=0; left[0]=0,right[n-1]=0; for(int i=1;i<n;i++){ left[i]=max(left[i-1],height[i-1]); } for(int i=n-2;i>=0;i--){ right[i]=max(right[i+1],height[i+1]); } for(int i=0;i<n;i++){ int now_size=min(left[i],right[i]); if(height[i]<now_size){ result+=now_size-height[i]; } } return result; } };