LCP 71-集水器
字符串数组 shape
描述了一个二维平面中的矩阵形式的集水器,shape[i][j]
表示集水器的第 i
行 j
列为: -'l'
表示向左倾斜的隔板(即从左上到右下); - 'r'
表示向右倾斜的隔板(即从左下到右上); - '.'
表示此位置没有隔板
![image.png](https://pic.leetcode-cn.com/1664424667-wMnPja-
image.png){:width=200px} 已知当隔板构成存储容器可以存水,每个方格代表的蓄水量为2
。集水器初始浸泡在水中,除内部密闭空间外,所有位置均被水填满。 现将其从水中竖直向上取出,请返回集水器最终的蓄水量。 注意: -
隔板具有良好的透气性,因此空气可以穿过隔板,但水无法穿过 示例 1: > 输入: > shape = ["....rl","l.lr.r",".l..r.","..lr.."]
> > 输出:18
> >
解释:如下图所示,由于空气会穿过隔板,因此红框区域没有水 ![image.png](https://pic.leetcode-
cn.com/1664436239-eyYxeP-image.png){:width=”280px”} 示例 2: > 输入: > shape = [".rlrlrlrl","ll..rl..r",".llrrllrr","..lr..lr."]
> 输出:18
> >
解释:如图所示。由于红框右侧未闭合,因此多余的水会从该处流走。 ![image.png](https://pic.leetcode-
cn.com/1664436082-SibVMv-image.png){:width=”400px”} 示例 3: > 输入: > shape = ["rlrr","llrl","llr."]
> 输出:6
> > 解释:如图所示。
![image.png](https://pic.leetcode-cn.com/1664424855-dwpUHO-
image.png){:width=”230px”} 示例 4: > 输入: > shape = ["...rl...","..r..l..",".r.rl.l.","r.r..l.l","l.l..rl.",".l.lr.r.","..l..r..","...lr..."]
输出:
30
> > 解释:如下图所示。由于中间为内部密闭空间,无法蓄水。 ![image.png](https://pic.leetcode-
cn.com/1664424894-mClEXh-image.png){:width=”350px”} 提示: -1 <= shape.length <= 50
-1 <= shape[i].length <= 50
-shape[i][j]
仅为'l'
、'r'
或'.'
视频讲解 已出炉,欢迎点赞三连,在评论区分享你对这场力扣杯的看法~
记录关键思路,详细的说明见视频讲解。
- 判断能否容纳水:第 i 行的水,在不走到第 i-1 行的前提下,无法触及左、右、下边界。
- 转换成连通性问题,用并查集处理。
- 为了方便判断是否触及边界,还需要在左、右、下各加一条格子。
- 根据 1,我们可以从最后一行往上计算。
- 用并查集合并当前行各个区域,以及边界。
- 如果合并完了,枚举当前行的各个区域,如果不和边界相连,那么该区域能容纳水。
- 边界、最上面一层和超级汇点 0 相连。
- 最后判断的时候,如果该区域能容纳水,且和超级汇点相连,那么不是闭合区域,就真的有水。
- 统计真的有水的格子,即为答案。
- 代码实现时,把每个格子划分四个区域,相对两个区域,代码写起来要容易一些。
1 | class Solution: |
1 | class Solution { |
1 | class Solution { |
1 | func reservoir(shape []string) int { |