这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
输入: height = [4,2,0,3,2,5]
输出: 9
提示
- n == height.length
- 0 <= n <= 3 *
- 0 <= height[i] <=
解题思路
这题目跟《盛最多水的容器》有点类似,也是要计算出中级的雨水量,那么在这里我们也可以采用类似于双指针的思路来进行推导。
- 定义数组
left[], 用来保存从左往右的最大高度
- 定义数组
right[], 用来保存从右往左的最大高度
- 再去两者较短的边,减去当前位置柱子的高度,即可计算出雨水量
代码实现
方法一:动态规划
class Solution {
public int trap(int[] height) {
int n = height.length;
if(0 == n){
return 0;
}
// 取得左边高度虚拟面积
int[] left = new int[n];
left[0] = height[0];
for(int i = 1; i < n; ++i){
left[i] = Math.max(left[i - 1], height[i]);
}
// 取得右边高度虚拟面积
int[] right = new int[n];
right[n - 1] = height[n - 1];
for(int i = n - 2; i >= 0; --i){
right[i] = Math.max(right[i + 1], height[i]);
}
// 统计雨水量
int res = 0;
for(int i = 0; i < n; ++i){
res += Math.min(left[i], right[i]) - height[i];
}
// 返回结果
return res;
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!