Description
Given a 2D grid consists of 0s (land) and 1s (water). An island is a maximal 4-directionally connected group of 0s and a closed island is an island totally (all left, top, right, bottom) surrounded by 1s.
Return the number of closed islands.
Example 1:
Input: grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
Output: 2
Explanation:
Islands in gray are closed because they are completely surrounded by water (group of 1s).
Example 2:
Input: grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
Output: 1
Example 3:
Input: grid = [[1,1,1,1,1,1,1],
[1,0,0,0,0,0,1],
[1,0,1,1,1,0,1],
[1,0,1,0,1,0,1],
[1,0,1,1,1,0,1],
[1,0,0,0,0,0,1],
[1,1,1,1,1,1,1]]
Output: 2
Constraints:
- 1 <= grid.length, grid[0].length <= 100
- 0 <= grid[i][j] <=1
分析
题目的意思是:找出矩阵中被包围的0区域的个数,我的思路很直接,把0的区域天秤2,这样的话,就避免了重复遍历;然后如果在填2的过程中走到了边界,说明它不是闭合的,即被1包围,我用flag记录一下就行了。
代码
class Solution:
def dfs(self,grid,i,j):
if(i<0 or i>=len(grid) or j<0 or j>=len(grid[0])):
return
if(grid[i][j]==0):
grid[i][j]=2
if(i==len(grid)-1 or i==0 or j==0 or j==len(grid[0])-1):
self.flag=False
else: return
dirs=[(0,-1),(0,1),(-1,0),(1,0)]
for d in dirs:
x=i+d[0]
y=j+d[1]
self.dfs(grid,x,y)
def closedIsland(self, grid: List[List[int]]) -> int:
m=len(grid)
n=len(grid[0])
res=0
for i in range(m):
for j in range(n):
if(grid[i][j]==0):
self.flag=True
self.dfs(grid,i,j)
if(self.flag):
res+=1
return res