依次统计每一个格子可以容纳得水量,经过分析得出,每个格子可以容纳的水量,取绝于左右两边最大高度的最小值,因此最直接的做法是在枚举格子i的时候,在向左和向后找这个最大值。然后取min,代码如下
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int res = 0;
for(int i = 1; i < n - 1; i++){
int leftHegiht = -1, rightHeght = -1;
for(int j = i - 1; j >= 0; j--){
leftHegiht = max(leftHegiht, height[j]);
}
for(int k = i + 1; k < n; k++){
rightHeght = max(rightHeght, height[k]);
}
res += max(min(leftHegiht, rightHeght) - height[i], 0);
}
return res;
}
};
可以把答案优化到O(N)吗?可以,先用O(n)的时间预处理left数right数组,这样就能在O(1)时间找到满足要求的数组。
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int res = 0;
if(n == 0){
return res;
}
vector<int> leftHegiht(n);
vector<int> rightHeght(n);
leftHegiht[0] = height[0];
for(int i = 1; i < n; i++){
leftHegiht[i] = max(leftHegiht[i-1], height[i]);
}
rightHeght[n - 1] = height[n - 1];
for(int i = n - 2; i >= 0; i--){
rightHeght[i] = max(rightHeght[i+1], height[i]);
}
for(int i = 1; i < n - 1; i++){
res += max(min(leftHegiht[i], rightHeght[i]) - height[i], 0);
}
return res;
}
};