思路:对于每个柱子i,雨水所能够达到的最大高度为 i左边最大值和右边最大值二者之中的最小值。只要理解了了这个思路,代码就很容易实现了。在具体实现时,为了避免对每个柱子每次分别向左向右找最大值的过程,首先对数字进行两次遍历,记录最小值和最大值,之后对数组遍历一次计算雨水总量即可。时间复杂度O(n)
代码:
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size(), ans=0;
if (n==0) return 0;
vector <int> left_max(n, 0); //left_max[i]记录0~i之间的最大值
vector<int> right_max(n, 0); //right_max[i]记录i~n-1之间的最大值
left_max[0] = height[0];
right_max[n-1] = height[n-1];
for (int i=1; i<n; ++i) //遍历数组,计算left_m