1. 程式人生 > >python leetcode Trapping Rain Water II

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