python leetcode Trapping Rain Water II

刚开始以为和Trapping Rain Water做法一样 就是设置四个方向的最大值 但出错了 错误原因:一维的话蓄水只能往左右扩展,但二维可以往四周扩展(可能是第一次是往右扩展第二次往下了第三次又往右了 即无法保持在同一纬度上扩展)所以无法简单地求出当前的最大值 见代码二
用BFS 先从最边上开始,利用queue进行更新
if peakMap[nx][ny] > limit: #当[nx,ny]更新时,进入队列对这个的周边进行更新
peakMap[nx][ny] = limit
queue.append((nx, ny))
缺点是会有重复遍历增加了运行时间

class Solution:
    def trapRainWater(self, heightMap):
        """
        :type heightMap: List[List[int]]
        :rtype: int
        """
        m=len(heightMap)
        if m<3: return 0 
        n=len(heightMap[0])
        if n<3: return 0 
        maxMin=[[20001]*n for _ in range(m)]
        queue=[]
        for i in range(m):
            for j in range(n):
                if i in (0,m-1) or j in (0,n-1):
                    maxMin[i][j]=heightMap[i][j]
                    queue.append((i,j))
        while queue:
            x,y = queue.pop(0) 
            for dx,dy in zip((1,0,-1,0),(0,1,0,-1)):
                nx,ny=x+dx,y+dy
                if nx<=0 or nx>=m-1 or ny<=0 or ny>=n-1: continue 
                nowH=max(maxMin[x][y],heightMap[nx][ny])
                if maxMin[nx][ny]>nowH:
                    maxMin[nx][ny]=nowH
                    queue.append((nx,ny))
        res=0
        for i in range(1,m-1):
            for j in range(1,n-1):
                res+=maxMin[i][j]-heightMap[i][j]
        return res
class Solution:
    def trapRainWater(self, heightMap):
        """
        :type heightMap: List[List[int]]
        :rtype: int
        """
        m=len(heightMap)
        if m<3: return 0 
        n=len(heightMap[0])
        if n<3: return 0 
        maxTop=[[0]*n for i in range(m)]
        maxBottom=[[0]*n for i in range(m)]
        maxLeft=[[0]*n for i in range(m)]
        maxRight=[[0]*n for i in range(m)]
        for j in range(n):
            maxTop[0][j]=heightMap[0][j]
            maxBottom[m-1][j]=heightMap[m-1][j] 
        for i in range(m):
            maxLeft[i][0]=heightMap[i][0]
            maxRight[i][n-1]=heightMap[i][n-1]
        for j in range(n):
            for i in range(1,m):
                maxTop[i][j]=max(maxTop[i-1][j],heightMap[i][j])
                maxBottom[m-i-1][j]=max(maxBottom[m-i][j],heightMap[m-i-1][j]) 
        for i in range(m):
            for j in range(1,n):
                maxLeft[i][j]=max(maxLeft[i][j-1],heightMap[i][j])
                maxRight[i][n-1-j]=max(maxRight[i][n-j],heightMap[i][n-1-j])
        res=0
        for i in range(1,m-1):
            for j in range(1,n-1):
                if min(maxTop[i][j],maxBottom[i][j],maxLeft[i][j],maxRight[i][j])>heightMap[i][j]:
                    res+=min(maxTop[i][j],maxBottom[i][j],maxLeft[i][j],maxRight[i][j])-heightMap[i][j]
        return res

猜你喜欢

转载自blog.csdn.net/Neekity/article/details/84633856