200 島嶼數量 python

2021-10-07 00:01:25 字數 2236 閱讀 6768

給你乙個由 『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...