在悬浮在太空中的二维矩阵中捕捉水

时间:2019-03-07 15:51:10

标签: python list numpy matrix heap

给定一个m x n的正整数矩阵,该矩阵表示悬浮在空间中的2D高程图中每个单元格的高度,计算从顶部无限供应水后能够捕获的水量。 0表示泄漏(矩阵悬浮在空间中) 注意:

m和n均小于110。每个晶胞的高度大于0且小于20,000。有一个列表列表,其中子列表中的0表示泄漏。 下面介绍了示例:

[[3, 3, 3, 3, 5, 3],
[3, 0, 2, 3, 1, 3],
[3, 1, 2, 3, 1, 3],
[3, 3, 3, 1, 3, 3]]
ans = 4

在这种情况下,我们只能装满4单位水。这是第5列中两个1的2个单位,因为如果填充了2个以上的单位,则会溢出。而第0到第3列左侧的左山谷中的水将通过0泄漏。

例如2

 [[1,4,3,1,3,2],
  [3,2,1,3,2,4],
  [2,3,3,2,3,1]]

Ans = 4 如何进行?
以下是将0视为地面的逻辑。我想将其修改为0,表示泄漏/排水。

def trapRainWater(self, heightMap):
    """
    :type heightMap: List[List[int]]
    :rtype: int
    """
    m = len(heightMap)
    if not m:
        return 0
    n = len(heightMap[0])
    if not n:
        return 0

    is_visited = [[False for i in xrange(n)] for j in xrange(m)]

    heap = []
    for i in xrange(m):
        heappush(heap, [heightMap[i][0], i, 0])
        is_visited[i][0] = True
        heappush(heap, [heightMap[i][n-1], i, n-1])
        is_visited[i][n-1] = True
    for j in xrange(n):
        heappush(heap, [heightMap[0][j], 0, j])
        is_visited[0][j] = True
        heappush(heap, [heightMap[m-1][j], m-1, j])
        is_visited[m-1][j] = True

    trap = 0
    while heap:
        height, i, j = heappop(heap)
        for (dx, dy) in [(1,0), (-1,0), (0,1), (0,-1)]:
            x, y = i+dx, j+dy
            if 0 <= x < m and 0 <= y < n and not is_visited[x][y]:
                trap += max(0, height - heightMap[x][y])
                heappush(heap, [max(height, heightMap[x][y]), x, y])
                is_visited[x][y] = True

    return trap

0 个答案:

没有答案