LeetCode 0200ナンバー諸島の島々ミディアムナンバー[] [] [DFS]パイソン
問題
2Dグリッドマップを考えると'1'
S(土地)と'0'
S(水)、島の数を数えます。島は水に囲まれ、水平方向または垂直方向に隣接するランドを接続することによって形成されています。あなたは、グリッドのすべての4つのエッジが全て水に囲まれていると仮定します。
例1:
Input:
11110
11010
11000
00000
Output: 1
例2:
Input:
11000
11000
00100
00011
Output: 3
問題
なる所定の'1'
(ランド)、及び'0'
二次元のグリッドコンピューティングの島の数からなる(水)。島は水に囲まれ、水平または垂直方向に隣接するランドに接続されているを通してです。あなたは、グリッドの四方を囲む水があると仮定することができます。
例1:
输入:
11110
11010
11000
00000
输出: 1
例2:
输入:
11000
11000
00100
00011
输出: 3
思考
DFS
对每个 "1" 进行 DFS,把它四周相邻的所有 “1” 全变为 “0”。
计算总的 DFS 次数,就是岛的个数。
時間計算量: O(N-M *)、mは列の数であり、nは列の数です。
宇宙複雑: Oの最悪のケース(M * N)、我々はすべての土地のケースです。
python3コード
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
ans = 0
# m, n = len(grid), len(grid[0]) # Runtime Error
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == "1":
self.dfs(grid, i, j)
ans += 1
return ans
# dfs template
def dfs(self, grid, i, j):
m, n = len(grid), len(grid[0])
directions = [(0, 1), (0, -1), (-1, 0), (1, 0)]
grid[i][j] = "0"
for direction in directions:
x, y = i + direction[0], j + direction[1]
if 0 <= x < m and 0 <= y < n:
if grid[x][y] == "1": # change "1" to "0"
self.dfs(grid, x, y)