給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
輸入:
11110
11010
11000
00000
輸出: 1
示例 2:
輸入:11000
11000
00100
00011
輸出: 3
遍歷–>兩種思路: dfs 或者 bfs
class
solution
:def
numislands
(self, grid: list[list[
str]])
->
int:
nr =
len(grid)
ifnot nr:
return
0 nc =
len(grid[0]
) counter =
0def
dfs(r,c)
: grid[r]
[c]=
'0'for x, y in
[(r,c-1)
,(r,c+1)
,(r+
1,c)
,(r-
1,c)]:
if0<= x < nr and
0<= y < nc and grid[x]
[y]==
'1':
dfs(x,y)
for r in
range
(nr)
:for c in
range
(nc)
:if grid[r]
[c]==
'1':
counter +=
1 dfs(r,c)
return counter
時間複雜度:o(mn)
空間複雜度:o(mn),在最壞情況下,整個網格均為陸地,深度優先搜尋的深度達到 mmn。
。
class
solution
:def
numislands
(self, grid: list[list[
str]])
->
int:
nr =
len(grid)
ifnot nr:
return
0 nc =
len(grid[0]
) counter =
0for r in
range
(nr)
:for c in
range
(nc)
:if grid[r]
[c]==
'1':
counter +=
1 grid[r]
[c]=
'0' neighbor = collections.deque(
[(r, c)])
while neighbor:
row, col = neighbor.popleft(
)for x, y in
[(row, col-1)
,(row, col+1)
,(row+
1, col)
,(row-
1, col)]:
if0<= x < nr and
0<= y < nc and grid[x]
[y]==
"1":
(x, y)
) grid[x]
[y]=
'0'return counter
時間複雜度:o(mn)
空間複雜度:o(min(m,n))
在最壞情況下,整個網格均為陸地,佇列的大小可以達到 min(m,n)。
因為bfs是分層遍歷的,離出發點最近的一層遍歷完再遍歷下一層,佇列中存放的元素數量最多就是層數的最大值,在這個矩陣中層數是min(m,n),所以空間複雜度是o(min(m,n))
200 島嶼數量
複雜度分析 時間複雜度 o m n 其中 m 和 n 分別為行數和列數。空間複雜度 最壞情況下為 o m n 此時整個網格均為陸地,深度優先搜尋的深度達到m n。class solution int numislands vector grid int cnt 0 for int i 0 i gri...
200 島嶼數量
leetcode 200.島嶼數量 島嶼另一種型別 求周長 leetcoed 463.島嶼的周長 廣度優先遍歷 bfs 深度優先遍歷 dfs 2.1 dfs 就是遇到乙個 1 遞迴下去繼續找 1 四周沒有 1 之後,逐層返回到上一層找四周剩餘的 1 本題不需要回溯 直接把 訪問過的標記即可 廣度優先...
200 島嶼數量
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和 或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例 1 輸入 grid 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0...