Given a 2D grid
consists of 0
s (land) and 1
s (water). An island is a maximal 4-directionally connected group of 0
s and a closed island is an island totally (all left, top, right, bottom) surrounded by 1
s.
Return the number of closed islands.
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).
Input: grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
Output: 1
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
1 <= grid.length, grid[0].length <= 100
0 <= grid[i][j] <=1
class Solution:
def closedIsland(self, grid: List[List[int]]) -> int:
m, n=len(grid), len(grid[0])
island=0
visited=set()
def dfs(i,j):
# if it is island on the edge
if i<0 or j<0 or i>=m or j>=n:
return 0
# if it is visited cell or it is not an island
if grid[i][j]==1 or (i,j) in visited:
return 1
visited.add((i,j))
t=dfs(i+1,j)
b=dfs(i-1,j)
l=dfs(i,j-1)
r=dfs(i,j+1)
return t and b and l and r
for i in range(m):
for j in range(n):
# if cell is island
if grid[i][j]==0 and (i,j) not in visited:
check=dfs(i,j)
# if it is closed island
if check:
island+=1
return island
My last line of DFS function was like this.
return dfs(i+1,j) and dfs(i-1,j) dfs(i,j-1) dfs(i,j+1)
And I was keep failing with the test case, and I couldn't find why..
Finally I found why it should be like below.
t=dfs(i+1,j)
b=dfs(i-1,j)
l=dfs(i,j-1)
r=dfs(i,j+1)
return t and b and l and r
You have to do this instead of
return dfs(...) and dfs(...)
, because you shall let each dfs finish and clean the 0 to 1, for the non closed islands, otherwise it will count more than it should in some cases.
References