一個 島嶼 是由一些相鄰的 1 (表明土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你能夠假設 grid 的四個邊緣都被 0(表明水)包圍着。數組
找到給定的二維數組中最大的島嶼面積。(若是沒有島嶼,則返回面積爲 0 。)函數
示例 1:spa
[[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 。code
示例 2:blog
[[0,0,0,0,0,0,0,0]]
對於上面這個給定的矩陣, 返回 0。遞歸
注意: 給定的矩陣grid 的長度和寬度都不超過 50。it
分析:io
咱們想知道網格中每一個連通形狀的面積,而後取最大值。function
若是咱們在一個土地上,以 4 個方向探索與之相連的每個土地(以及與這些土地相連的土地),那麼探索過的土地總數將是該連通形狀的面積。class
爲了確保每一個土地訪問不超過一次,咱們每次通過一塊土地時,將這塊土地的值置爲 0。這樣咱們就不會屢次訪問同一土地。
1.遍歷grid獲得每一個位置島嶼🏝面積的最大值,返回一個maxArea
2.搜索函數-遞歸實現dfs函數
3.判斷邊界,若不在邊界內,返回0;不然爲1,遞歸計算上下左右是否爲1,area計算島嶼面積;
4.判斷完每一個位置須要將其置0(gridi=0)
var maxAreaOfIsland = function (grid) { var maxArea = 0; //記錄保持者 for (let i = 0; i < grid.length; i++) { for (let j = 0; j < grid[0].length; j++) { if (grid[i][j] === 1) { maxArea = Math.max(maxArea, dfs(grid, i, j)); //更新記錄 } } } function dfs(grid, i, j) { if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] === 0) { return 0; //遞歸出口邊界 } grid[i][j] = 0; //避免重複計算,沉島策略 var area = 1; area += dfs(grid, i + 1, j); //上面的1 area += dfs(grid, i - 1, j); //下面的1 area += dfs(grid, i, j + 1); //左面的1 area += dfs(grid, i, j - 1); //右面的1 return area } return maxArea //返回最大面積 };