LeetCode经典困难题-接雨水
题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
来源:力扣(LeetCode)
解题思路
这道题一开始的思路是求一个一个坑的蓄水体积再相加,但问题是情况会有很多种,这时这种情况就该如何把问题‘化整为0’,也就是把问题拆分为一个个小问题,所以我们可以把一个一个坑的蓄水体积,化为求每个下标位置的蓄水体积就可以了, 那求每个下标的位置怎么求呢?
博主想到了遍历两边到该下标最大值,通过取两者最小值,得到该下标的蓄水体积。
具体代码
class Solution {
public int trap(int[] height) {
if (height.length == 1) return 0;
int n = height.length;
int[] num = new int[n];
int lMax = 0;
//获取左边最大高度用lMax存储,用num记录每个下标左边的最大高度
for (int i = 0; i < n; i++) {
lMax = Math.max(lMax, height[i]);
num[i] = lMax;
}
int rMax = 0;
int res = 0;
//获取右边最大高度用rMax存储,通过比较num记录左边值取较小一位减去当前高度
for (int i = n - 1; i >= 0; i--) {
rMax = Math.max(rMax, height[i]);
if(rMax!=0&&num[i]!=0){
int count = Math.min(num[i], rMax) - height[i];
//判断可能该下标为较高高度,没有蓄水
if(count>0) res += count;
}
}
return res;
}
}