【算法python實現】 -- 島嶼的個數

原題: https://leetcode-cn.com/problems/number-of-islands/


思路

深度優先遍歷

從頂點開始,到其相鄰的一個節點,再由此節點至其相鄰的節點,依次遍歷全部相鄰的節點,直到某個節點相鄰節點所有遍歷完成。數組

注意:spa

  1. 遍歷順序可自定,但全部節點需聽從統一規則
  2. 深度遍歷可能會有遺漏節點,所以需回溯,即全程爲一個遞歸過程

解題

狀況1: 網格不存在code

返回:0遞歸

狀況2: 網格爲空(即二維數組爲空數組)leetcode

返回:0get

狀況3: 網格存在且不爲空io

從[0,0]點循環列表,依次將每一個點做爲深度優先遍歷的根節點class

若根節點值爲0,執行下一輪循環import

若根節點值爲1,島數量+1,開始DFSgrid

DFS制定規則爲左右上下

遍歷過的節點值修改成0

題目中直接修改會對原始網格產生影響,因此深拷貝一個副本,不影響原始網格


代碼

import copy

class Solution:
    def numIslands(self, grid) -> int:
        if not grid or not grid[0]:
            return 0

        loc_grid = copy.deepcopy(grid)

        self.m, self.n = len(loc_grid), len(loc_grid[0])
        num = 0

        for i in range(self.m):
            for j in range(self.n):
                if int(loc_grid[i][j]) == 0:
                    continue
            
                num += 1
                self.__dfs(loc_grid, i, j)

        return num

    def __dfs(self, loc_grid, i, j):
    
        if i < 0 or i  == self.m or j < 0 or j  == self.n:
            return

        if int(loc_grid[i][j]) == 0:
            return
    
        loc_grid[i][j] = 0

        self.__dfs(loc_grid, i, j-1)
        self.__dfs(loc_grid, i, j+1)
        self.__dfs(loc_grid, i-1, j)
        self.__dfs(loc_grid, i+1, j)

說明

用了深拷貝是由於直接丟進去原矩陣會致使原矩陣被修改,若是隻是作題的話能夠不考慮這點,速度和空間都會有所提高。

相關文章
相關標籤/搜索