参考:
https://blog.youkuaiyun.com/qq_26410101/article/details/81784803
1.两次遍历数组,依次记录每个位置左边和右边的最大值left[i]
和right[i]
,其中
left[i]
表示i位置左边的最大高度
right[i]
表示i位置右边的最大高度
那么只有当left[i]
和right[i]
都大于i位置的高度时,在i位置上才会有积水(积水指当前位置之上有水,这种方法是计算每个位置上的雨水量之和得到结果的)。
积水量是min(left[i],right[i])-height[i]
其中height[i]表示i位置的高度
class Solution {
public:
int trap(vector<int>& height) {
vector<int> left(height.size(), INT_MIN);
vector<int> right(height.size(), INT_MIN);
int left_max = INT_MIN;
int right_max = INT_MIN;
int res = 0;
for (int i = 0; i < height.size(); i++) {
left[i] = max(left_max, (i>0?left[i-1]:0)); //注意left[0]取0
left_max = max(left_max, height[i]);
}
for (int i = height.size()-1; i >=0; i--) {
right[i] = max(right_max, (i<(height.size() - 1) ? right[i + 1] : 0));
right_max = max(right_max, height[i]);
int mm = min(left[i], right[i]);
res = res + (mm > height[i] ? mm-height[i]: 0); //将求right数组和计算最终结果放在一块可以少一次遍历
}
return res;
}
};