欢迎访问我的力扣github仓库,有JavaScript和C++两个版本,每日更新
题解:
我没有用到很复杂的数据结构,单纯是一列列求出来的,所以时间复杂度为较大,O(n^2)
- 从第二列开始,到倒数第二列结束,分别找出当前所在列的左右两边的最高列
- 短板效应可知,左右两边最高列中的那个较低的就是能够接雨水的极限高度
- 只要比当前所在列高,就减去当前列的高度,那么就是当前所在列能够接雨水的高度
- 累加这些接雨水的高度就是最终答案
C++代码:
class Solution {
public:
int trap(vector<int>& height) {
int size=height.size(),sum=0;
// 第一列和最后一列不会积水
for(int i=1;i<size-1;i++){
int max_left=0;
for(int j=0;j<i;j++) //求左边最高的柱子
if(max_left<height[j])
max_left=height[j];
int max_right=0;
for(int j=i+1;j<size;j++) //右边最高的柱子
if(max_right<height[j])
max_right=height[j];
if(min(max_left,max_right)>height[i]) //短板效应,然后比当前列高才能积水
sum+=min(max_left,max_right)-height[i];
}
return sum;
}
};
JS代码:
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
var sum=0;
// 第一列和最后一列不会积水
for(var i=1;i<height.length-1;i++){
var max_left=0;
for(var j=0;j<i;j++)//求左边最高的柱子
if(max_left<height[j])
max_left=height[j];
var max_right=0;
for(var j=i+1;j<height.length;j++)//右边最高的柱子
if(max_right<height[j])
max_right=height[j];
if(Math.min(max_left,max_right)>height[i])//短板效应,然后比当前列高才能积水
sum+=Math.min(max_left,max_right)-height[i];
}
return sum;
};
42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6