417,BFS和DFS兩種方式求島嶼的最大面積

2021-10-09 14:28:38 字數 2180 閱讀 1984

給定乙個包含了一些0和1的非空二維陣列grid 。

乙個島嶼是由一些相鄰的1(代表土地)構成的組合,這裡的「相鄰」要求兩個1必須在水平或者豎直方向上相鄰。你可以假設grid的四個邊緣都被0(代表水)包圍著。

找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為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。

dfs解決

這題無論使用dfs還是bfs都很好解決,dfs就是沿著乙個方向一直走下去,直到不滿足條件為止(要麼走出grid的邊緣,要麼當前位置是0),就像下面這樣,

**如下

public

intmaxareaofisland

(int

grid)

return maxarea;

}public

intdfs

(int

grid,

int i,

int j)

return0;

}

bfs解決bfs我們可以使用乙個佇列來實現,他的實現原理就是如果乙個位置是1,我們就把他上下左右為1的點的座標全部加入到佇列中,然後改變當前位置的座標為0,防止重複計算。加入佇列之後再乙個個出隊,然後再以出隊的那個點重複上面的操作……,直到隊列為空為止。就像下面這樣,假如遍歷到紅色的1,我們就把他上下左右為1的位置座標全部加入到佇列中。

//分別表示右,左,下,上,四個方向

int[

] dirs =,,

,};int res =1;

while

(!queue.

isempty()

) grid[x]

[y]=0;

res++

; queue.

offer

(new

int)

;}}return res;

}總結如果對圖的遍歷比較了解的話,這兩種方式很容易想到,乙個是沿著乙個方向一直走下去,乙個就像波浪一樣,沿著乙個點然後往四周一圈一圈的發散。

C DLL匯出的兩種方式和鏈結的兩種方式

第一種 匯出方式 extern c declspec dllexport int plus int x,int y extern c declspec dllexport int sub int x,int y extern c declspec dllexport int mul int x,in...

BFS和DFS兩種方式實現二叉樹的層序遍歷

二叉樹的前序遍歷 二叉樹的中序遍歷 二叉樹的後序遍歷 二叉樹的層序遍歷 二叉樹的前序 中序 後序 層序遍歷 解法完整版 三 總結 給你乙個二叉樹,請你返回其按層序遍歷得到的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返...

java兩種方式實現執行緒求奇數 偶數

package com.ljl.org.test4 demo interview author jilongliang date 2013 4 17 分別使用runnable介面和thread類程式設計實 編寫一應用程式建立兩個執行緒乙個執行緒列印輸出1 1000之間所有的奇數 odd number...