695. 岛屿的最大面积(中等)- LeetCode

题目描述

在这里插入图片描述

自己解法

广度优先搜索(BFS),遍历过的点都置0,时间复杂度 O ( m ∗ n ) O(m*n) O(mn),空间复杂度 O ( m i n [ m , n ] ) O(min[m,n]) O(min[m,n])

class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        maxArea = 0
        H,W = len(grid),len(grid[0])
        queue = collections.deque()
        for i in range(H):
            for j in range(W):
                chooseArea = 0
                if grid[i][j] == 0:
                    continue
                else:
                    chooseArea += 1
                    queue += [(i,j)]
                    grid[i][j] = 0  
                    while queue:
                        x,y = queue.popleft()                      
                        for k,m in [(x-1,y),(x+1,y),(x,y+1),(x,y-1)]:
                            if 0 <= k < H and 0 <= m < W and grid[k][m] == 1:
                                chooseArea += 1
                                queue += [(k,m)]
                                grid[k][m] = 0
                    maxArea = max(maxArea,chooseArea)
        return maxArea

在这里插入图片描述
这题可以用深度优先搜索(DFS),时间复杂度 O ( m ∗ n ) O(m*n) O(mn),空间复杂度 O ( m ∗ n ) O(m*n) O(mn)自己实现的代码如下,

class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        maxArea = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                maxArea = max(maxArea,self.dfs(i,j,grid))
        return maxArea
    
    def dfs(self,x,y,grid):
        ans = 0
        if grid[x][y] == 1:
            grid[x][y] = 0
            ans += 1
            for k,m in [(x-1,y),(x+1,y),(x,y+1),(x,y-1)]:
                if 0 <= k < len(grid) and 0 <= m < len(grid[0]):
                    ans += self.dfs(k,m,grid)
        return ans

在这里插入图片描述

可以看出DFS栈消耗的空间明显多于BFS队列消耗的空间,符合空间复杂度的分析。

官方解答

参考链接

官方解法中也是采取了深度优先搜索和广度优先搜索两种方法,深度优先搜索(DFS)的代码是:

class Solution:
    def dfs(self, grid, cur_i, cur_j):
        if cur_i < 0 or cur_j < 0 or cur_i == len(grid) or cur_j == len(grid[0]) or grid[cur_i][cur_j] != 1:
            return 0
        grid[cur_i][cur_j] = 0
        ans = 1
        for di, dj in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
            next_i, next_j = cur_i + di, cur_j + dj
            ans += self.dfs(grid, next_i, next_j)
        return ans

    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        ans = 0
        for i, l in enumerate(grid):
            for j, n in enumerate(l):
                ans = max(self.dfs(grid, i, j), ans)
        return ans

在这里插入图片描述

广度优先搜索(BFS)的代码是:

class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        ans = 0
        for i, l in enumerate(grid):
            for j, n in enumerate(l):
                cur = 0
                q = collections.deque([(i, j)])
                while q:
                    cur_i, cur_j = q.popleft()
                    if cur_i < 0 or cur_j < 0 or cur_i == len(grid) or cur_j == len(grid[0]) or grid[cur_i][cur_j] != 1:
                        continue
                    cur += 1
                    grid[cur_i][cur_j] = 0
                    for di, dj in [[0, 1], [0, -1], [1, 0], [-1, 0]]:
                        next_i, next_j = cur_i + di, cur_j + dj
                        q.append((next_i, next_j))
                ans = max(ans, cur)
        return ans

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值