前端算法 島嶼的最大面積 DFS(深度優先搜索)

image

給定一個包含了一些 0 和 1 的非空二維數組 grid 。

一個 島嶼 是由一些相鄰的 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 //返回最大面積
};
相關文章
相關標籤/搜索