島嶼數量-dfs算法

題目

給你一個由 ‘1’(陸地)和 ‘0’(水)組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。此外,你可以假設該網格的四條邊均被水包圍。

示例 1:

輸入:
11110
11010
11000
00000
輸出: 1

示例 2:

輸入:
11000
11000
00100
00011
輸出: 3


解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連接而成。

思路:

遍歷島這個二維數組,如果當前數爲1,即爲島,則執行dfs函數向四周探查,進入探測並將島個數+1:dfs函數就是一個遞歸標註的過程,它會將所有相連的1都標註成2(也可以標註其他數字,目的是標記此處,以防止重複遍歷),這樣就避免了遍歷過程中的重複計數的情況,也大大降低了dfs的次數。

Java代碼實現:

class Solution {
    public int numIslands(char[][] grid) {
    	//定義一個統計島嶼的變量
        int islandNum = 0;
        //循環遍歷島
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
            	//如果爲1,則進行dfs探測,找出周圍相連的所有島,構成一個島嶼
                if(grid[i][j] == '1'){
                    dfs(grid, i, j);
                    islandNum++;
                }
            }
        }
        return islandNum;
    }
    //探測函數
    public void dfs(char[][] grid, int i, int j){
    	//判斷當前島的邊界及是否爲島的條件
        if(i < 0 || i >= grid.length ||
           j < 0 || j >= grid[0].length || grid[i][j] != '1'){
            return;
        }
        //如果是島,則設置標記爲2,防止重複遍歷
        grid[i][j] = '2';
        //探測當前島的下面是否爲島
        dfs(grid, i + 1, j);
        //探測當前島的上面是否爲島
        dfs(grid, i - 1, j);
        //探測當前島的右邊面是否爲島
        dfs(grid, i, j + 1);
        //探測當前島的左面是否爲島
        dfs(d, i, j - 1);
    }
}

代碼執行效率:
在這裏插入圖片描述

總結:

此題爲經典算法之一,dfs解決迷宮問題。難點在於如何確定島的周圍有多少相連的島,我們採用dfs算法,從一個島發散到周圍所有相連的島,遞歸出所有可能的島。希望小夥伴們能理解消化此題。如有疑問,可下方留言,博主會第一時間給你答覆。這也是博主入博的第二個月,望各位大佬多多支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章