1. 程式人生 > 實用技巧 >DFS_695. 島嶼的最大面積

DFS_695. 島嶼的最大面積

給定一個包含了一些 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。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/max-area-of-island


思路:

標準的DFS類題目,深度優先嘛就遞迴

遍歷一下這個陣列,如果判斷到這個陣列的值是1,並且是我們還沒有判斷過的

那麼就向他的四個方向(上下左右)進行判斷,判斷是不是1並且是不是判斷過的,用area記錄一下就可以了

注意:程式開始前特殊情況的判斷,遞迴時候是否越界的判斷

class Solution {
    
//從下面的函式看上來,需要定義一個方向,上下左右 final int [][] DIRS = new int[][]{{-1,0} , {1,0} , {0,-1} , {0,1}}; public int maxAreaOfIsland(int[][] grid){ //傳進來一個二維陣列,做基本判斷 if (grid == null || grid.length == 0 || grid[0].length == 0){ return 0; } //獲取grid陣列的行和列 final int row = grid.length;
final int col = grid[0].length; //定義一個數組判斷當前位置是否已經判斷過 boolean [][] isVisited = new boolean[row][col]; //定義一個變數,判斷這個的連通區域有多少 int res = 0; //遍歷陣列 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (grid[i][j] == 1 && !isVisited[i][j]){ res = Math.max(res,dfs(grid,i,j,isVisited)); } } } return res; } //定義一個深度優先搜尋的方法,需要確定每個點的狀態 public int dfs(int [][] grid,int i, int j, boolean[][] isVisited){ //只要這個點進了遞迴層,那麼久說明這個點現在是被訪問過了的 isVisited[i][j] = true; //當前的area就是1 int area = 1; //現在就要對他的上下左右的點進行判斷,返回前面定義一個方向 for (int[] DIR : DIRS){ int newRow = i + DIR[0]; int newCol = j + DIR[1]; if (checkBoundary(grid,newRow,newCol) && grid[newRow][newCol] == 1 && !isVisited[newRow][newCol]){ area += dfs(grid,newRow,newCol,isVisited);; } } return area; } //定義一個判斷是否越界的方法 public boolean checkBoundary(int [][] grid, int i, int j){ final int row = grid.length; final int col = grid[0].length; return i >= 0 && i < row && j >= 0 && j < col; } }