力扣活動0315 695 島嶼的最大面積

2022-01-26 07:58:30 字數 2726 閱讀 8436

給定乙個包含了一些 0 和 1的非空二維陣列grid, 乙個島嶼是由四個方向 (水平或垂直) 的1(代表土地) 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。

找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為0。)

示例 1:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],

[0,0,0,0,0,0,0,1,1,1,0,0,0],

[0,1,1,0,1,0,0,0,0,0,0,0,0],

[0,1,0,0,1,1,0,0,1,0,1,0,0],

[0,1,0,0,1,1,0,0,1,1,1,0,0],

[0,0,0,0,0,0,0,0,0,0,1,0,0],

[0,0,0,0,0,0,0,1,1,1,0,0,0],

[0,0,0,0,0,0,0,1,1,0,0,0,0]]

對於上面這個給定矩陣應返回6。注意答案不應該是11,因為島嶼只能包含水平或垂直的四個方向的『1』。

示例 2:

[[0,0,0,0,0,0,0,0]]
對於上面這個給定的矩陣, 返回0

注意:給定的矩陣grid的長度和寬度都不超過 50。

1. dfs(pos_x,pos_y) 函式通過遞迴在陸地上移動

2. 通過self.count來記錄陸地的數量

class

solution(object):

def__init__

(self):

self.count =0

defmaxareaofisland(self, grid):

""":type grid: list[list[int]]

:rtype: int

"""def

dfs(pos_x,pos_y):

if pos_x<0 or pos_x>=len(grid) or pos_y<0 or pos_y>=len(grid[0]):

return

if idx[pos_x][pos_y] == 1 or grid[pos_x][pos_y]==0:

return

self.count+=1idx[pos_x][pos_y] = 1

for mv_ in

move_:

dfs(pos_x + mv_[0],pos_y + mv_[1])

idx = [[0 for x in range(len(grid[0])) ] for y in

range(len(grid)) ]

move_ = [(-1,0),(0,-1),(0,1),(1,0)]

ans =0

for x in

range(len(grid)):

for y in

range(len(grid[0])):

self.count =0

dfs(x,y)

ans =max(ans,self.count)

return ans

1. 構造乙個二維陣列的方法 :  matrix = [[0 in range(5)] in range(5)] 

2. 通過公共變數self.count來儲存遞迴的中間值。(那麼如何用return來返回遞迴的中間值呢?)

3. for mv_ inmove_: dfs(pos_x + mv_[0],pos_y + mv_[1]) 

這一句可以這樣寫更簡潔

for mi, mj in move_:pass 

4. 我的思路中用了額外的空間 idx來記錄訪問的情況,題解的處理方法是把訪問過的陸地(1) 改成 海洋(0) 。降低了空間複雜度。

class

solution:

defdfs(self, grid, cur_i, cur_j):

if cur_i < 0 or cur_j < 0 or cur_i == len(grid) or cur_j == len(grid[0]) or grid[cur_i][cur_j] != 1:

return

0 grid[cur_i][cur_j] =0

ans = 1

for di, dj in [[0, 1], [0, -1], [1, 0], [-1, 0]]:

next_i, next_j = cur_i + di, cur_j +dj

ans +=self.dfs(grid, next_i, next_j)

return

ans

def maxareaofisland(self, grid: list[list[int]]) ->int:

ans =0

for i, l in

enumerate(grid):

for j, n in

enumerate(l):

ans =max(self.dfs(grid, i, j), ans)

return ans

1. 注意題解中儲存遞迴結果的方法。

力扣 島嶼的周長

給定乙個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。網格中的格仔水平和垂直方向相連 對角線方向不相連 整個網格被水完全包圍,但其中恰好有乙個島嶼 或者說,乙個或多個表示陸地的格仔相連組成的島嶼 島嶼中沒有 湖 湖 指水域在島嶼內部且不和島嶼周圍的水相連 格仔是邊長為 1 的正...

力扣 島嶼的周長

給定乙個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。網格中的格仔水平和垂直方向相連 對角線方向不相連 整個網格被水完全包圍,但其中恰好有乙個島嶼 或者說,乙個或多個表示陸地的格仔相連組成的島嶼 島嶼中沒有 湖 湖 指水域在島嶼內部且不和島嶼周圍的水相連 格仔是邊長為 1 的正...

力扣LeetCode 島嶼數量

給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1 示例 2 輸入 11000 11000 00100 0...