Leetcode 42 接雨水 (Trapping Rain Water) 题解分析
题目介绍
给定 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 个单位的雨水(蓝色部分表示雨水)。
简单分析
其实最开始的想法是从左到右扫区间,就是示例中的第一个水槽跟第二个水槽都可以用这个办法解决
前面这种是属于右侧比左侧高的情况,对于左侧高右侧低的就不行了,(写这篇的时候想起来可以再反着扫一遍可能可以)
所以这个方案不好,贴一下这个方案的代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public int trap(int[] height) {
int lastLeft = -1;
int sum = 0;
int tempSum = 0;
boolean startFlag = true;
for (int j : height) {
if (startFlag && j <= 0) {
startFlag = false;
continue;
}
if (j >= lastLeft) {
sum += tempSum;
tempSum = 0;
lastLeft = j;
} else {
tempSum += lastLeft - j;
}
}
return sum;
}
后面结合网上的解法,其实可以反过来,对于每个格子找左右侧的最大值,取小的那个和当前格子的差值就是这一个的储水量了
理解了这种想法,代码其实就不难了
代码
1 | int n = height.length; |