python leetcode Trapping Rain Water II
阿新 • • 發佈:2018-12-01
剛開始以為和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