岛屿数量的递归解决方案

Posted

技术标签:

【中文标题】岛屿数量的递归解决方案【英文标题】:A recursive solution to the number of islands 【发布时间】:2019-04-17 05:26:52 【问题描述】:

我正在努力解决问题Number of Islands - LeetCode

给定'1's(陆地)和'0's(水)的二维网格图,计算岛屿的数量。岛屿四面环水,由相邻陆地水平或垂直连接而成。您可以假设网格的所有四个边缘都被水包围。

示例 1:

Input:
11110
11010
11000
00000

Output: 1

示例 2:

Input:
11000
11000
00100
00011

Output: 3

公认的解决方案是:

#Recursively solution 
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid:
            return 0
        step = 0
        r, c = len(grid), len(grid[0])
        visited = [[False for _ in range(c)] for _ in range(r)]
        for i in range(r):
            for j in range(c):
                if grid[i][j] == "1" and not visited[i][j]:
                    step += 1
                    self.dfs(grid, i, j, visited)
        return step

    def dfs(self, grid, i, j, visited):
        if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]) or grid[i][j] != '1' or visited[i][j]:        
            return 
        visited[i][j] = True
        self.dfs(grid, i+1, j, visited)
        self.dfs(grid, i-1, j, visited)
        self.dfs(grid, i, j+1, visited)
        self.dfs(grid, i, j-1, visited)

解决方案混合使用了递归和迭代。

如何仅通过递归解决问题?

【问题讨论】:

我只是出于好奇。如果它迭代地工作,为什么要它是递归的? 从技术上讲,您可以对其进行 DFS,而不是迭代 map,但调用堆栈可能会膨胀太多。 Idk 是否有限制。 cos,我正在练习递归@AlbinPaul 【参考方案1】:

您需要做的就是将循环更改为递归函数,该函数在到达行尾时从某个坐标 (r,c) 转到下一个坐标 (r,c+1) 或 (r+1,0)。

示例代码:

def numIslands(grid, row, col):
    if not grid: return 0

    ans = 0

    if grid[row][col]==1:
        ans+=1
        dfs(grid,row,col)

    col+=1
    if col == len(grid[0]):
        col=0
        row+=1

    if row == len(grid):
        return ans

    return ans + numIslands(grid, row, col)

def dfs(grid, i, j):
    if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]) or grid[i][j] != 1:        
        return 
    grid[i][j] = -1
    dfs(grid, i+1, j)
    dfs(grid, i-1, j)
    dfs(grid, i, j+1)
    dfs(grid, i, j-1)


print(numIslands([
[1,1,0,0,0],
[1,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]
],0,0))

【讨论】:

以上是关于岛屿数量的递归解决方案的主要内容,如果未能解决你的问题,请参考以下文章

200.岛屿数量 leetcode

岛屿数量

LeetCode | 200. 岛屿数量

LeetCode Java刷题笔记—200. 岛屿数量

DFS 算法秒杀五道岛屿问题

[JavaScript 刷题] 搜索 - leetcode 200 & 695