刚开始以为和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