LeetCode 695 島嶼的最大面積

2022-06-06 13:21:07 字數 1475 閱讀 9199

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

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

[[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』。

class solution 

private:

int dx[4] ;

int dy[4] ;

int dfs(vector>& grid, int x, int y)

return ans;

}};

dfs每進入乙個新的節點1,則總島嶼數量加1,體現在int ans = 1這一步。dx與dy是上下左右方向的橫縱座標變化量。將經過的點值都設為0,避免重複運算。

class solution ;

int dy[4] ;

for (int i = 0; i < m; i++)

res = max(res, ans);}}

}return res;

}};

遞迴函式其實就是棧呼叫的另一種形式,這裡顯式地使用棧來進行dfs,這樣做還有乙個優點,就是改bfs很簡單,下面會講到。具體做法就是:將需要遍歷的上下左右點橫縱座標全部入棧,再乙個乙個做判斷看是否滿足要求。需要入棧的引數其實和遞迴形式dfs傳的引數是一樣的,因為本質就是一樣的。棧空時,說明這個區域的連1都搜尋完了。

在將座標存入棧前,可以預先判斷該點是否滿足要求。這樣的操作後,雖然不能保證棧中的所有座標都滿足要求(比如某座標加入棧後,該座標被另外的座標點dfs遍歷到,該點也會失效),但是也顯著地減小了時間與空間消耗。

class solution ;

int dy[4] ;

for (int i = 0; i < m; i++)

res = max(res, ans);}}

}return res;

}};

其實就是把棧換成了佇列,再把取top改為取front。非常好理解。

LeetCode 695島嶼最大面積

給定乙個包含了一些 0 和 1 的非空二維陣列 grid 乙個 島嶼 是由一些相鄰的 1 代表土地 構成的組合,這裡的 相鄰 要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0 代表水 包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為 0 示例...

leetcode 695 島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列grid,乙個 島嶼 是由四個方向 水平或垂直 的1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0,0...

leetcode 695 島嶼的最大面積

給定乙個包含了一些 0 和 1的非空二維陣列 grid 乙個 島嶼 是由四個方向 水平或垂直 的 1 代表土地 構成的組合。你可以假設二維矩陣的四個邊緣都被水包圍著。找到給定的二維陣列中最大的島嶼面積。如果沒有島嶼,則返回面積為0。示例 1 0,0,1,0,0,0,0,1,0,0,0,0,0 0,0...