本题的最佳思路看起来不难,但我一开始没想出来,即:一次遍历矩阵中所有元素,如果该元素为岛屿则加4,并判断该元素的左边和上边是否为岛屿,如果是则减2。
class Solution:
def islandPerimeter(self, grid: List[List[int]]) -> int:
row = len(grid)
column = len(grid[0])
island_count = 0
repeat_border = 0
for r in range(row):
for c in range(column):
if grid[r][c] == 1:
island_count += 1
if c+1 < column and grid[r][c] == grid[r][c+1] :
repeat_border += 1
if r > 0 and grid[r][c] == grid[r-1][c] :
repeat_border += 1
return island_count*4 - 2*repeat_border
我一开始的思路是对每个元素判断上下左右是否是岛屿。
class Solution:
def islandPerimeter(self, grid: List[List[int]]) -> int:
'''
超时做法
def isWater(i,j,m,n,grid):
print(i,j,m,n)
if (i<0 or i>=m) or (j<0 or j>=n):
return 1
elif grid[i][j]==0:
return 1
return 0
m=len(grid)#m行
n=len(grid[0])#n列
result=0
for i in range(m):
for j in range(n):
if grid[i][j]==1:#是陆地
result+=isWater(i-1,j,m,n,grid)
result+=isWater(i+1,j,m,n,grid)
result+=isWater(i,j-1,m,n,grid)
result+=isWater(i,j+1,m,n,grid)
# print(i,j,result)
return result
'''
后面用类似哈希表的方法来做,设置两个矩阵来分别保存元素的上下边和元素的左右边,最后求和。
class Solution:
def islandPerimeter(self, grid: List[List[int]]) -> int:
m=len(grid)#m行
n=len(grid[0])#n列
rows=[[False for i in range(n)]for j in range(m+1)]#m+1行n列
cols=[[False for i in range(n+1)]for j in range(m)]#m行n+1列
for i in range(m):
for j in range(n):
# print(i,j)
if grid[i][j]==1:
rows[i][j]= not rows[i][j]
rows[i+1][j]= not rows[i+1][j]
cols[i][j]= not cols[i][j]
cols[i][j+1]= not cols[i][j+1]
result=0
for r in rows:
for c in r:
if c==True:
result+=1
for r in cols:
for c in r:
if c==True:
result+=1
return result