Leetcode 接雨水 Python

这个实在有点难,上代码吧

基本都是遍历再判别的算法,但是要理清"什么情况下才满足能储水"确实费神

class Solution:

    def trapRainWater(self, heightMap: List[List[int]]) -> int:

        if len(heightMap) <= 2 or len(heightMap[0]) <= 2:

            return 0

        m, n = len(heightMap), len(heightMap[0])

        visited = [[0 for _ in range(n)] for _ in range(m)]

        pq = []

        for i in range(m):

            for j in range(n):

                if i == 0 or i == m - 1 or j == 0 or j == n - 1:

                    visited[i][j] = 1

                    heapq.heappush(pq, (heightMap[i][j], i * n + j))

        

        res = 0

        dirs = [-1, 0, 1, 0, -1]

        while pq:

            height, position = heapq.heappop(pq)

            for k in range(4):

                nx, ny = position // n + dirs[k], position % n + dirs[k + 1]

                if nx >= 0 and nx < m and ny >= 0 and ny < n and visited[nx][ny] == 0:

                    if height > heightMap[nx][ny]:

                        res += height - heightMap[nx][ny]

                    visited[nx][ny] = 1    

                    heapq.heappush(pq, (max(height, heightMap[nx][ny]), nx * n + ny))

        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值