题目链接
题目描述
实现代码
简单思想:对于每一个位置i,其能积水的情况为:height[i] 比当前位置左右两边的列表最大值left_max和right_max都要小;积水量为:min(left_max, right_max) - height[i]
实现代码如下:
class Solution {
public int trap(int[] height) {
int len = height.length;
if (len == 1) {
return 0;
}
int result = 0;
int left_max = height[0];
for (int i = 1; i < len - 1; i++) {
if(left_max <= height[i]) {
left_max = height[i];
continue;
}
// find right max
int right_max = height[i + 1];
for (int j = i + 2; j < len; j++) {
if (right_max < height[j]) {
right_max = height[j];
}
}
// update result
if (left_max <= height[i] || right_max <= height[i]) {
left_max = left_max < height[i] ? height[i] : left_max;
continue;
}
result += Math.min(left_max, right_max) - height[i];
}
return result;
}
}
在前面方法实现的基础上进行优化,我们可以先分别进行两次遍历计算每个位置的左边最大值和右边最大值,这样就能将复杂度降为O(n)了,如图示: