【leetcode】劍指 Offer II 105. 島嶼的最大面積-【深度優先DFS】

叫我詹躲躲發表於2022-04-10

給定一個由 0 和 1 組成的非空二維陣列 grid ,用來表示海洋島嶼地圖。

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

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

圖片.png

示例 1:

輸入: grid = [[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

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

示例 2:

輸入: grid = [[0,0,0,0,0,0,0,0]]
輸出: 0

 

提示:

    m == grid.length
    n == grid[i].length
    1 <= m, n <= 50
    grid[i][j] is either 0 or 1

解題思路

  1. 遍歷記錄訪問過和未訪問過的島嶼;如果為島嶼則將狀態置為已訪問;
  2. 分別向上下左右進行遍歷,記錄島嶼的數量,並且置當前島嶼為已訪問;
  3. 根據大的島嶼,更新島嶼記錄

解題程式碼及其註釋

/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxAreaOfIsland = function (grid) {
    let col = grid.length,row = grid[0].length,max=0; //行、列
    //未訪問過的島嶼為1,訪問過的島嶼為0
    let matrix = [...Array(col)].fill(0).map(()=> [...Array(row)].fill(1))
    let dfs = (i,j)=>{
        //邊界
        if(i<0 || i>=col || j<0 || j>=row) return 0;
        let ret=0;
        let temp = matrix[i][j] //是否為島嶼
        matrix[i][j] = 0 //訪問過的島嶼標記為 0
        if(grid[i][j] && temp){
            ret+=dfs(i+1,j) //下
            ret+=dfs(i-1,j) //上
            ret+=dfs(i,j+1) //右
            ret+=dfs(i,j-1) //左
            ret++
        }
        return ret
    }
    for(let i=0;i<col;i++){
        for(let j=0;j<row;j++){
            if(grid[i][j]===1){
                //更新島嶼記錄
                max = Math.max(max,dfs(i,j))
            }
        }
    }
    return max
};

總結【DFS】

深度優先搜尋演算法(Depth-First-Search):是一種用於遍歷或搜尋樹或圖的演算法。 沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個程式反覆進行直到所有節點都被訪問為止。深度優先搜尋是基於棧實現的,Stack 先入後出。

DFS主要步驟

主要步驟:
1.構建一個遞迴函式,函式引數應該最起碼包括題目需求使用的引數
2.找到邊界,遞迴函式裡首先列出遞迴結束的條件,即滿足要求或者超出範圍
3.接著列出所有可能移動或者變化的路徑

相關文章